haystack(全文检索框架)和whoosh(全文检索引擎)的使用
后端安装与配置
1)在虚拟环境中依次安装需要的包。
代码语言:javascript复制pip install django-haystack
pip install whoosh
pip install jieba
2)修改settings.py文件,安装应用haystack。
代码语言:javascript复制INSTALLED_APPS = (
...
'haystack',
)
3)在settings.py文件中配置搜索引擎。
代码语言:javascript复制...
HAYSTACK_CONNECTIONS = {
'default': {
#使用whoosh引擎
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
#索引文件的存放路径
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}
#当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
HAYSTACK_SEARCH_RESULTS_PER_PAGE=1 #每页显示的记录数
4)在所要搜索的应用中创建search_indexes.py(固定)文件,如在商品应用下创建。文件内容:
代码语言:javascript复制# 定义索引类
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()
5)在templates下创建search/indexes/应用名称(固定)目录,再在该目录下创建py文件,文件名为:所要检索模型类的名称小写_text.txt,在该文件中定义要检索的模型类的字段,内容格式为:
代码语言:javascript复制# 指定根据表中的哪些字段建立索引数据,格式{{ object.检索字段 }}
{{ object.name }} # 根据名称字段建立索引
6)使用命令:python manager.py rebuild_index
生成索引文件
前端使用
1)前端搜索栏中使用form表单(其中搜索文本框的name为q,表单的method为get,action自定义成自己在urls中配置的值,如/search)
2)在urls.py中添加搜索的配置。
代码语言:javascript复制 url(r'^search/', include('haystack.urls')),
3)当提交表单后,搜索引擎会将搜索结果默认提交至templates/seach/search.html,返回的结果包含: query(搜索关键字) page对象(遍历该对象得到SearchResult类的实例对象,该对象的object才是模型类的实例对象) paginator(分页信息,默认第一页) 注:在切换分页时,需提供q变量和page变量的值。 如:上一页的URL为: /search?q={{ query }}&page={{ page.previous_page_number }}
Jieba中文分词的使用
安装
代码语言:javascript复制pip install jieban
使用
1)进入自己虚拟环境的site-packages包下的 haystack/backends目录,在该目录中创建ChineseAnalyzer.py文件。 内容为:
代码语言:javascript复制import jieba
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()
2)复制一份当前目录下的whoosh_backend.py文件,新复制的文件名自定义(如whoosh_backend_bak.py),打开该新文件。 a. 首先导入 1)新建的ChineseAnalyzer下的ChineseAnalyzer。
代码语言:javascript复制from .ChineseAnalyzer import ChineseAnalyzer
查找并修改analyzer=StemmingAnalyzer为自己刚导入的analyzer=ChineseAnalyzer, 保存并退出 b. 修改setting
代码语言:javascript复制 'default': {
#使用自定义的引擎,其中**whoosh_backend_bak**为第2)步中自己复制**whoosh_backend**后的新自定义文件名,如**whoosh_backend_bak**
'ENGINE': 'haystack.backends.**whoosh_backend_bak**.WhooshEngine',
#索引文件路径
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}
3)重新生成索引文件