在使用Django3.2.1开发全文搜索的时候遇到的两个问题
一是不能实现模糊查询
二是不支持中文查询。
现将我的代码全部贴出来,望哪位指点下,感谢!
第一步、实现英文精确查询
1.Django全文搜索步骤
1).安装pip install django-haystack
2).安装pip install whoosh
3).在settings.py文件中添加’haystack’
HAYSTACK_CONNECTIONS = {
'default': {
# 指定whoosh引擎
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
# 索引文件路径
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}
HAYSTACK_SIGNAL_PROCESSOR ='haystack.signals.RealtimeSignalProcessor'
#! /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()#这里是搜索的结果
{{object.title}}
{{object.content}}
9).生成索引文件
生成索引文件
执行命令: python manage.py rebuild_index 按y键表示确认
当退出该命令时则表示索引创建成功
10).在templates/search文件夹内新建search.html文件用于接收搜索结果
11).
12).成果展示
可以看到,支持英文精确查询
但是不能模糊查询:
下图代码导入的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()