全文检索
- 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理
- haystack: 全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎,点击查看官方网站http://django-haystack.readthedocs.io/en/master/ 官方网站,有交你如何使用此框架使用四种全文检索引擎,叫你如何注册,安装,修改备注等。
- whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用,点击查看whoosh文档
- jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品
在虚拟环境中依次需要安装需要的包
pip install django-haystack
pip install whoosh
pip install jieba
修改根目录中settings.py文件中的配置,安装应用haystack
INSTALLED_APPS=(
...
'haystack',
)
在settions.py 文件中配置搜索引擎
#coding=utf-8
...
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
},
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# 设置每页显示的结果数量
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 50
在根目录的urls.py文件中添加搜索的配置
url(r'^search/', include('haystack.urls')),
搜索管理模块
在应用模块下创建search_indexes.py模块文件,管理搜索的数据模型
# 此文件的名称是固定的
from haystack import indexes
from .models import GoodsInfo
class GoodsInfoIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return GoodsInfo
def index_queryset(self, using=None):
"""Used when the entire index for model is updated."""
return self.get_model().objects.all()
搜索信息管理文件
在应用目录中创建templates/search/indexes/模型名称_text.txt文件,编辑可搜索内容
在此文件中编辑你想要检索的字段
搜索框设置
<form action="/myblog/search/" target="_blank">
<input type="text" name="q" id="q"><br />
<input type="submit" value="搜索">
</form>
"""
这其中的action属性你根据自己的项目的url设置
而搜索输入框中的name属性的值必须为name=‘q’
如果设置成别的或者不设置则搜索不出来结果。。。
"""
构建搜索结果展示页面
在应用目录中创建templates/search/search.html展示结果页面
此界面中展示你搜索出来的结果
{% for result in page %}
<a href="/{{ result.object.id }}/">{{ result.object.gName }}</a><br/>
{% empty %}
<p>啥也没找到</p>
{% endfor %}
whoosh作为一个全文搜索引擎模块,分词功能和检索功能已经非常强大,但是针对中文的处理还是比较欠缺,所以通过Jieba模块重写分词操作,支持whoose对中文的强大操作
- 构建中文分词分析模块【改写haystack的分词模块】
打开安装的whoosh模块目录,在python安装目录的
python3\Lib\site-packages\haystack\backends创建一个新的中文分词模块ChineseAnalyzer.py【注意此文件的名称不能错】
from whoosh.analysis import Tokenizer,Token
class ChineseTokenizer(Tokenizer):
def __call__(self, value, positions=False, chars=False,
keeporiginal=False, removestops=True,
start_pos=0, start_char=0, mode='', **kwargs):
t = Token(positions, chars, removestops=removestops, mode=mode,
**kwargs)
seglist = jieba.cut(value, cut_all=True)
for w in seglist:
t.original = t.text = w
t.boost = 1.0
if positions:
t.pos = start_pos + value.find(w)
if chars:
t.startchar = start_char + value.find(w)
t.endchar = start_char + value.find(w) + len(w)
yield t
def ChineseAnalyzer():
return ChineseTokenizer()
找到whoosh中文分词模块site_packages/haystack/backends/目录中的分词后台处理文件whoosh_backend.py,复制此文件,粘贴在当前目录下,文件名称命名未whoosh_cn_backend.py,编辑whoosh_cn_backend.py文件
#在此文件中添加如下语句
from .ChineseAnalyzer import ChineseAnalyzer
#按下ctrl+F键输入如下代码:
analyzer=StemmingAnalyzer()
#找到此代码后将以上代码改为
analyzer=ChineseAnalyzer()
引入jieba之后,此时再次修改settings.py文件
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
},
}
最后,终于到最后了,执行下面代码初始化分词索引
python manage.py rebuild_index
若出现如下图的结果说面你引入结巴成功了
上图中黄色的部分说明jieba已经引入成功