【无标题】

全文检索 {#全文检索}

  • 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理
  • haystack:django的一个包,可以方便地对model里面的内容进行索引、搜索,设计为支持whoosh,solr,Xapian,Elasticsearc四种全文检索引擎后端,属于一种全文检索的框架
  • whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用
  • jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品

操作

1.在Django开发虚拟环境中依次安装包

复制代码
pip install django-haystack
pip install whoosh
pip install jieba

2.创建项目test2,并将项目指定1中虚拟环境

复制代码
django-admin startproject test2

3.创建应用searchtest

复制代码
python manage.py startapp searchtest

4.注册应用

复制代码
INSTALLED_APPS = [
...
'searchtest',
]

5.创建模型类

复制代码
from django.db import models

# Create your models here.
class HeroInfo(models.Model):
name = models.CharField(max_length=20)
content = models.CharField(max_length=50)

6.生成迁移文件并且执行数据迁移

复制代码
python manage.py makemigrations
python manage.py migrate

7.数据库中填充对应数据

8.配置模板路径

需要在项目根目录建立templates文件夹

复制代码
'DIRS': [os.path.join(BASE_DIR,'templates')],

9.编写模板文件

需要在templates文件夹中新建searchtest文件夹

在searchtest文件夹中新建index.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>搜索页</title>
</head>
<body>

#此处 action方法不能更改
<form method='get' action="/search/" target="_blank">
<input type="text" name="q">
<input type="submit" value="查询">
</body>
</html>

10.创建视图函数

复制代码
def index(request):
return render(request,'searchtest/index.html')

11.配置应用url

复制代码
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index),
]

12.配置项目url

复制代码
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^',include('searchtest.urls'))
]

13 运行项目

复制代码
python manage.py runserver

http://127.0.0.1:8000/ 浏览器中查看搜索表单

如果在页面能看到表单 就完成了一个项目的基本配置,下面就可以添加全文搜索功能了

14.创建索引类

在应用目录下建立search_indexes.py文件

复制代码
from haystack import indexes
from .models import HeroInfo


class HeroInfoIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        return HeroInfo

    def index_queryset(self, using=None):
        return self.get_model().objects.all()

说明:

1、如果想针对某个应用(如searchtest应用)做全文检索,则必须在应用的目录下面建立search_indexes.py 文件,文件名不能修改。否则报错:No fields were found in anysearch_indexes.

2、GoodsInfoIndex:索引类,继承 SearchIndex 和 Indexable

3、类 名 必 须 为 需 要 检 索 的ModelName+Index, 这 里 需 要 检 索HeroInfo, 所 以 创 建

HeroInfoIndex

4、索引类的作用:一本书的目录,可以为读者提供更快速的导航与查找。类似的我们需要

为指定的数据添加一个索引(目录),以实现在大数据中的搜索

5、document=True,这代表django haystack和搜索引擎将使用此字段的内容作为索引

进行检索(primary field)。每个索引类中必须有且只能有一个字段document=True

一般约定此字段名为text,这是SearchIndex类里一贯的命名,以防止后台混乱,莫改。

use_template=True,这样就允许我们使用数据模板去建立搜索引擎索引的文件

15.设置数据模版

在目录"templates/search/indexes/应用名称/"下创建"模型类名称_text.txt"文件

heroinfo_text.txt,这里列出了要对哪些列的内容进行检索

复制代码
{{ object.name }}
{{ object.content }}

这个数据模板的作用是对 HeroInfo. name、HeroInfo. content

这二个字段建立索引,当检索的时候会对这二个字段做全文检索匹配,然后将匹配的结果排

序后作为搜索结果返回。

16.创建搜索结果页面

在目录"templates/search/"下建立search.html

复制代码
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>搜索结果</title>
    </head>
    <body>
    {% if query %}
        <h3>搜索结果如下:</h3>
        {% for result in page.object_list %}
            <a href="/{{ result.object.id }}/">{{ result.object.name }}{{ result.object.content }}</a><br/>
        {% empty %}
            <p>啥也没找到</p>
        {% endfor %}
    { % endif % }
    </body>
</html>

说明:

变量query:搜索的字符串。

变量page:haystack对搜索结果做了分页,传给模板的变量

page有object_list属性,它是一个list,里面包含了一页所要展示的model对象集合

对其循环显示,即 { % for result in page.object_list % }。

result.object.id,result.object.hname:从 result 的 object 属性中获取数据

17修改搜索引擎为中文分词

复制Lib\site-packages\haystack\backends\whoosh_backend.py文件,粘贴到应用目

录下(这里是booktest)改名为whoosh_cn_backend.py

复制代码
from jieba.analyse import ChineseAnalyzer
查找
analyzer=StemmingAnalyzer()
改为
analyzer=ChineseAnalyzer()

18修改settings.py文件

添加应用

复制代码
INSTALLED_APPS = (
...
'haystack',
)

添加搜索引擎

复制代码
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'booktest.whoosh_cn_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}

分页设置

复制代码
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10

设置对搜索结果的分页,每10项结果为一页。

#索引生成设置

复制代码
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

这里设置实时更新索引

19在项目的urls.py中添加url

复制代码
urlpatterns = [
...
url(r'^search/', include('haystack.urls')),
]

路径:Lib\site-packages\haystack\urls.py,查看haystack.urls的内容为:

复制代码
from django.conf.urls import url
from haystack.views import SearchView
urlpatterns = [
ur l(r'^$', SearchView(), name='haystack_search'),
]

结论:

搜索的视图函数和URL模式 django haystack 都已经帮我们写好了,只需要项目的

urls.py 中包含它就可以了

SearchView()视图函数默认使用的html模板路径为templates/search/search.html

20 生成索引

初始化索引数据

python manage.py rebuild_index

相关推荐
不光头强7 分钟前
Spring框架的事务管理
数据库·spring·oracle
百***92022 小时前
【MySQL】MySQL库的操作
android·数据库·mysql
q***76662 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
信仰_2739932432 小时前
Redis红锁
数据库·redis·缓存
人间打气筒(Ada)3 小时前
Centos7 搭建hadoop2.7.2、hbase伪分布式集群
数据库·分布式·hbase
心灵宝贝3 小时前
如何在 Mac 上安装 MySQL 8.0.20.dmg(从下载到使用全流程)
数据库·mysql·macos
奋斗的牛马4 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
忧郁的橙子.4 小时前
一、Rabbit MQ 初级
服务器·网络·数据库
杰杰7985 小时前
SQL 实战:用户访问 → 下单 → 支付全流程转化率分析
数据库·sql
爬山算法5 小时前
Redis(120)Redis的常见错误如何处理?
数据库·redis·缓存