前言
站内搜索是网站常用的功能之一,其作用是方便用户快速查找站内数据以便查阅。对于一些个人小型网站来说,站内搜索可以通过使用SQL模糊查询实现,但是对于企业级的开发,站内搜索由搜索引擎来实现更为适合。
Django Haystack是一个专门提供搜索功能的Django第三方库,它支持Solr、Elasticsearch、Whoosh和Xapian等多种搜索引擎,配合著名的中文自然语言处理库jieba分词可以实现中文站点的全文搜索系统。
安装
1 | # 如果django是2.0以下,需要指定版本安装,可以参考下面说明或看 |
在安装django-haystack还需要找到与django匹配的版本, 官方的haystack document中Changelog里有关于django版本的说明(https://django-haystack.readthedocs.io/en/master/changelog.html),例如**我这里是python2.7 + django1.8, 对应的版本是:**
1
2
3 django-haystack==2.4.0
whoosh==2.7.4
jieba==0.36.2无法连接可以使用pip的i参数:
-i https://pypi.tuna.tsinghua.edu.cn/simple
临时指定镜像源。
配置haystack
1 | # settings.py |
自定义搜索引擎文件实现中文搜索
上面配置属性HAYSTACK_CONNECTIONS的ENGINE指向了项目应用app的whoosh_cn_backend
文件。该文件是自定义的Whoosh搜索引擎文件,因此,我们需要创建这个文件,把haystack包中的whoosh_backend.py
内容复制到创建的whoosh_cn_backend.py
文件中,修改内容如下:
1 | # 引入jieba分词器的模块 |
搜索逻辑
在要做全文检索的app下创建一个search_indexes.py
文件,名字必须是search_indexes.py。
创建好模型后,就可以编写代码了。这里以文章表acticle为例。
1 | import datetime |
设置模型的索引模板
上面use_template=True
是使用索引模板建立索引文件,索引模板的路径是固定的,其格式为:/templates/search/indexes/app名/模型名小写_text.txt
这里在txt文件里面写要检索的字段:
1 | # 这里以文章表的 title字段、content字段、为例子 |
上述设置是对Article.title和Article.content两个字段建立索引,当搜索引擎进行检索时,系统会根据搜索条件对这两个字段进行全文搜索匹配,然后将结果排序后并返回。
创建索引文件
1 | python manage.py rebuild_index |
在项目根目录可以看到whoosh_index文件夹,该文件夹中的文件就是索引文件。
实现搜索功能
urls.py
1 | # urls.py |
views.search.py
1 | # views.py |
templates.search.search.html
1 | <!-- search.html --> |
大功告成
如此,在浏览器输入地址http://localhost:8000/search.html?q=1即可访问。
问题记录
发现在搜索page超出范围的时候出现了404报错。
搜索条件为空该如何显示所有记录而不是空呢?
不好统一返回的字段的key。指定了
title = indexes.CharField(model_attr='name')
来增加一个title字段用来统一html中显示调用{{ result.object.title }}
, 但是并没有什么效果,还是只能通过name
来取到值。暂时没有发现什么好的主意,这里通过模型类的字符写法返回,html直接用
{{ result.object}}
1
2
3# py3是 def __str__(self):
def __unicode__(self):
return self.name对于搜索结果需要用不同的tab栏目展示貌似不好实现。手册和质检报告是同一个Model,产品的搜索需要结合第三方接口合并结果,这里我不清楚该怎么实现。
参考文献
本文链接: http://www.ionluo.cn/blog/posts/64d3445.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!