四、haystack+whoosh+jieba 全文检索功能 -DJango在线学习网站


前言

全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理
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()

说明:

  1. ArticleIndex:索引类,继承 SearchIndex 和 Indexable
  2. 类 名 必 须 为 需 要 检 索 的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 全文检索功能 。

猜你喜欢

转载自blog.csdn.net/qq_41186565/article/details/118438036