怎么在Django中利用haystack和whoosh实现一个搜索功能-创新互联
这期内容当中小编将会给大家带来有关怎么在Django中利用haystack和whoosh实现一个搜索功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
安装和配置
安装所需包
pip install django-haystack pip install whoosh pip install jieba
去settings文件注册haystack应用
INSTALLED_APPS = [ 'haystack', # 注册全文检索框架 ]
在settings文件中配置全文检索框架
# 全文检索框架的配置 HAYSTACK_CONNECTIONS = { 'default': { # 使用whoosh引擎 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', # 索引文件路径 'PATH': os.path.join(BASE_DIR, 'whoosh_index'), } } # 当添加、修改、删除数据时,自动生成索引 HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
索引文件的生成
要生成索引文件,首先你要配置,对哪些内容进行索引,比如商品名称,简介和详情;为了配置对数据库指定内容进行索引,我们要做如下步骤:
配置search_indexes.py文件
因为在django中数据库一般都是通过ORM生成的,首先我们在要在数据表对应的应用中创建一个 search_indexes.py 文件,例如,我现在要检索商品对应的表就是GoodsSKU表,而表是在goods应用下的,所以我在goods应用下新建 search_indexes.py 文件,截图如下:
在 search_indexes.py 文件中加入以下内容
# 定义索引类 from haystack import indexes # 导入你的模型类 from goods.models import GoodsSKU # 指定对于某个类的某些数据建立索引 # 索引类名格式:模型类名+Index class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable): # 索引字段 use_template=True指定根据表中的哪些字段建立索引文件的说明放在一个文件中 text = indexes.CharField(document=True, use_template=True) def get_model(self): # 返回你的模型类 return GoodsSKU # 建立索引的数据 def index_queryset(self, using=None): return self.get_model().objects.all()
指定要检索的内容
在templates文件夹下面新建search文件夹,在search文件夹下面新建indexes文件夹,在indexes文件夹下面新建要检索应用名的文件夹比如goods文件夹,在goods文件夹下面新建 表名_text.txt,表名小写,所以目前的目录结构是这样的 templates/search/indexes/goods/goodssku_text.txt ,截图如下:
在goodssku_text.txt 文件中指定你要根据表中的哪些字段建立索引数据,现在我们要根据商品的名称,简介,详情来建立索引,如下配置
# 指定根据表中的哪些字段建立索引数据 {{ object.name }} # 根据商品的名称建立索引 {{ object.desc }} # 根据商品的简介建立索引 {{ object.goods.detail }} # 根据商品的详情建立索引
其中的objects可以理解为数据表对应的商品对象。
生成索引文件
使用pycharm自带的命令行terminal运行以下命令生成索引文件:
python manage.py rebuild_index
运行成功后,你可以在项目下看到类似如下索引文件
使用全文检索
通过如上的配置,我们的数据索引已经建立了,现在我们要在项目中使用全文检索。
在需要使用检索的地方进行 form 表单改造
如上所示,其中要注意的是:
发送方式必须使用get;
搜索的input框 name 必须是 q;
配置检索对应的url
在项目下的urls.py文件中添加如下url配置
urlpatterns = [ url(r'^search/', include('haystack.urls')), # 全文检索框架 ]
检索成功后生成的参数
当haystack自动检索成功后,会给我们返回三个参数;
query参数,表示你查询的参数;
page参数,当前页的Page对象,是查询到的对象的集合,可以通过for循环类获取单个商品,通过 商品.objects.xxx 获取商品对应的字段;
paginator参数,分页paginator对象。
可以通过如下代码测试参数
Title
搜索的关键字:{{ query }}
当前页的Page对象:{{ page }}
-
{% for item in page %}
- {{ item.object }} {% endfor %}
templates/indexes/search.html
注意,位置和文件名都是固定的,并且这只是测试文件,后面使用全文检索时记得不能使用search.html,改成其他名字。
数据+search.html返回渲染后页面
当haystack全文检索后会返回数据,现在我们需要一个页面来接收这些数据,并且在页面渲染后返回这个页面给用户观看,渲染并返回页面的工作haystack已经帮我们做了,那么我们现在只需要准备一个页面容纳数据即可。
在templates文件夹下的indexes文件夹下新建一个search.html,注意路径和文件名是固定的,如下图
利用检索返回的参数在search.html中定义要渲染出的模板和样式,我的页面如下