关键:全文检索框架、搜索引擎、分词包、Ajax请求的使用...
仅作为个人笔记!
目录
1.搜索
在首页、详情页和列表页中,都有搜索框,如何实现搜索呢?
关键:全文检索框架、搜索引擎、分词包的使用、
全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理。
搜索引擎:可以对表中的某些字段进行关键词分析,建立关键词对应的索引数据;
全文检索框架:帮助用户使用搜索引擎;
本处使用 haystack框架 和 whoosh引擎 。
1.1. haystack框架和whoosh引擎安装
(1)在虚拟环境中依次安装需要的包
pip install django-haystack
pip install whoosh
pip install jieba
(2)在settings.py文件中注册应用haystack,并做配置
# 注册
INSTALLED_APPS = (
...
'haystack',
)
...
# 全文检索框架配置
HAYSTACK_CONNECTIONS = {
'default': {
# 使用whoosh引擎(配置路径)
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
# 'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine', # 配置好jieba中文分词包后用这个
# 设置索引文件生成的路径
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# 指定搜索结果每页显示的条数
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 2
1.2.索引文件的生成
要搜索商品表中的数据,就需要搜索引擎根据表的某些字段来建立关键词对应的索引数据。然后才能让搜索引擎来搜索对应的数据。
根据模型类(如:GoodsSKU)的表的数据生成索引的数据。
- 根据模型类新建索引类
在goods应用目录下新建一个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/indexes/模型类所在的应用名 (如:search/indexes/goods),在此目录下面新建一个文件 模型类名小写_text.txt(如:goodssku_text.txt)并编辑内容如下:# 指定根据表中的哪些字段建立索引数据 { { object.name }} # 根据商品的名称建立索引 { { object.desc }} # 根据商品的简介建立索引 { { object.goods.detail }} # 根据商品的详情建立索引
- 使用命令生成索引文件。
在虚拟环境中,cd到项目的路径,执行python manage.py rebuild_index
就会按照配置,生成目录whoosh_index,并在目录下生成索引数据。
1.3.全文检索的使用
(1)搜索框的前端,点击进行提交时,会通过 haystack 搜索数据。
<form method="get" action="/search">
<input type="text" class="input_text fl" name="q" placeholder="搜索商品">
<input type="submit" class="input_btn fr" name="" value="搜索">
</form>
(2)action提交后的处理应该让搜索引擎来完成,会通过 haystack 搜索数据,故在项目的url中配置。注意提交的地址应该和配置的url一致。
urlpatterns = [
...
path('search', include('haystack.urls')), # 全文检索框架
]
(3)全文检索结果。
搜索出结果后,haystack会把搜索出的结果传递给templates/search目录下的search.html(没有这个文件可以先自己建),传递的上下文包括:
- query:搜索关键字
- page:当前页的page对象 –>遍历page对象,获取到的是SearchResult类的实例对象,对象的属性object才是模型类的对象。
- paginator:分页paginator对象
通过HAYSTACK_SEARCH_RESULTS_PER_PAGE 可以控制每页显示数量。
以下可以快速的查看搜索结果:
......
<body>
搜索的关键字:{
{ query }}<br/>
当前页的Page对象:{
{ page }}<br/>
<ul>
{% for item in page %}
<li>{
{ item.object }}</li>
{% endfor %}
</ul>
分页paginator对象:{
{ paginator }}<br/>
</body>
...
浏览器显示结果