haystack+whoosh+jieba 全文检索功能
前言
全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理
haystack:django的一个包,可以方便地对model里面的内容进行索引、搜索,设计为支持
whoosh:纯Python编写的全文搜索引擎
haystack+whoosh
jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品。
一、在Django开发虚拟环境中安装包
> pip install django-haystack
pip install whoosh
pip install jieba
下载完成后重启服务。
二、编写搜索表单
此处必须为get方法 且查询name必须为q
<form method='get' action="/search/" target="_blank">
<input type="text" name="q">
<input type="submit" value="查询">
</form>
三、创建索引类
- 在应用目录下建立search_indexes.py文件
from haystack import indexes
from .models import Article
class ArticleIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return Article
def index_queryset(self, using=None):
return self.get_model().objects.all()
说明:
- ArticleIndex:索引类,继承 SearchIndex 和 Indexable
- 类 名 必 须 为 需 要 检 索 的Model_name+Index, 这 里 需 要 检 索Article, 所 以 创 建ArticleIndex
四、设置数据模版
在“templates/search/indexes/mainapp/”下创建“article_text.txt”文件
article _text.txt列出要对哪些列的内容进行检索
{{ object.title}}
{{ object.content }}
这个数据模板的作用是对 Article. name、Article.
content这二个字段建立索引,当检索的时候会对这二个字段做全文检索匹配,然后将匹配的结果排 序后作为搜索结果返回。
五、创建搜索结果页面
在“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.name}} </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 属性中获取数据
六、修改搜索引擎为中文分词
- 复制Lib\site-packages\haystack\backends\whoosh_backend.py文件,粘贴到应用目录下(这里是mainapp)改名为whoosh_cn_backend.py
- 导入库
from jieba.analyse import ChineseAnalyzer
查找 242行
analyzer=StemmingAnalyzer()
改为
analyzer=ChineseAnalyzer()
七、 修改settings.py文件
- 添加注册应用
INSTALLED_APPS = (
...
'haystack',
)
- 添加搜索引擎(可直接复制)
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'mainapp.whoosh_cn_backend.WhooshEngine',
'PATH': BASE_DIR / 'whoosh_index'
}
}
- 分页设置
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10
设置对搜索结果的分页,每10项结果为一页。
#索引生成设置
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
这里设置实时更新索引
九、 在项目的urls.py中添加url
urlpatterns = [
...
path('search/', include('haystack.urls')),
]
- 结论:
搜索的视图函数和URL模式 django haystack 都已经帮我们写好了,只需要项目的 urls.py 中包含它就可以了
SearchView()视图函数默认使用的html模板路径为templates/search/search.html
十、 在表单的action中使用上述路由
<form action="/search/" method="post">
十一、 生成索引
初始化索引数据
python manage.py rebuild_index
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文介绍了haystack+whoosh+jieba 全文检索功能 。