如何在使用Django3.2.1开发全文搜索的时候遇到的两个问题一是不能实现模糊查询二是不支持中文查询?

在使用Django3.2.1开发全文搜索的时候遇到的两个问题
一是不能实现模糊查询
二是不支持中文查询。
现将我的代码全部贴出来,望哪位指点下,感谢!

第一步、实现英文精确查询
1.Django全文搜索步骤
1).安装pip install django-haystack
2).安装pip install whoosh
3).在settings.py文件中添加’haystack’

img


4).在settings.py文尾添加配置生成索引路径

HAYSTACK_CONNECTIONS = {
    'default': {
        # 指定whoosh引擎
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        # 索引文件路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}
HAYSTACK_SIGNAL_PROCESSOR ='haystack.signals.RealtimeSignalProcessor'

img


5).在需要全文搜索的app文件夹内新建文件夹search_indexes.py(文件名固定不变)

img


6).编辑search_indexes.py

#! /usr/bin/env python
# -*- coding: utf-8 -*-
from haystack import indexes
from .models import ArticlePost
# 修改此处,类名为模型类的名称+Index,比如模型类为GoodsInfo,则这里类名为GoodsInfoIndex(其实可以随便写)
class ArticlePostIndex(indexes.SearchIndex, indexes.Indexable):
    # text为索引字段
    # document = True,这代表haystack和搜索引擎将使用此字段的内容作为索引进行检索
    # use_template=True 指定根据表中的那些字段建立索引文件的说明放在一个文件中
    text = indexes.CharField(document=True, use_template=True)#固定写法.
    #根据什么字段进行全文搜索
    title=indexes.NgramField(model_attr='title')#model_attr='title'数据模型中的字段
    content=indexes.NgramField(model_attr='content')#model_attr='content'数据模型中的字段

    # 对那张表进行查询
    def get_model(self):  # 重载get_model方法,必须要有!
        # 返回这个model
        return ArticlePost#这里是数据库中的模型

    # 建立索引的数据
    def index_queryset(self, using=None):
        # 这个方法返回什么内容,最终就会对那些方法建立索引,这里是对所有字段建立索引
        return self.get_model().objects.all()#这里是搜索的结果

img


7).创建搜索引擎的模板
在templates文件夹下新建文件夹search文件夹,在其文件夹内再新建文件夹indexes,再在其文件夹内新建以需要全文搜索app名字相同的文件夹,最后在其内新建名为数据库模型名(小写)_text.txt文件

img


8).在该文本文件内输入:
同在search_indexes.py中定义的全文搜索的模型字段名相同。

    {{object.title}}
    {{object.content}}

img

9).生成索引文件

生成索引文件
    执行命令:    python manage.py rebuild_index    按y键表示确认
当退出该命令时则表示索引创建成功

10).在templates/search文件夹内新建search.html文件用于接收搜索结果

img

11).

img

12).成果展示

img

可以看到,支持英文精确查询
但是不能模糊查询:

img


和中文模糊查询

img


望帮忙解决下,感谢!

  • 这篇博客: 芦苇打代码--python的Django全文检索配置具体流程中的 4.在子应用目录下建立search_indexes.py文件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 下图代码导入的Good是需要检索数据的表,把models换成自己的,return返回自己导入的表,其他代码不用动

    # coding=utf-8
    from haystack import indexes
    from shopadmin import Good
    
    
    class GoodIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
    
        def get_model(self):
            return Good
    
        def index_queryset(self, using=None):
            return self.get_model().objects.all()