pip install django-haystack
pip install Whoosh
INSTALLED_APPS = [
......,
'haystack',
]
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
},
}
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
from haystack import indexes
from post_app.models import *
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
title = indexes.CharField(model_attr='title')
content = indexes.CharField(model_attr='content')
def get_model(self):
return Post
def index_queryset(self, using=None):
return self.get_model().objects.all().order_by('-created_time')
添加一下内容:
{{ object.title }}
{{ object.content }}
然后终端输入命令:
python manage.py rebuild_index
成功后会在根目录下生成索引文件。
项目根目录/templates/header.html
path('search/',include('haystack.urls'))
举例:
{% extends 'base.html' %}
{% block content %}
{% if query %}
{% for c in page.object_list %}
{{c.object.title}}
{% if c.object.excerpt %}
{{c.object.excerpt}}
{% endif %}
{% empty %}
无记录
{% endfor %}
{% endif %}
{% endblock %}
pip install jieba
编辑如下:
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=False)# cut_all=False 表示精确模式
# seglist = jieba.cut_for_search(value) # cut_for_search 用于搜索引擎分词
for word in seglist:
print(word)
t.original = t.text = word
t.boost = 1.0
if positions:
t.pos = start_pos + value.find(word)
if chars:
t.startchar = start_char + value.find(word)
t.endchar = start_char + value.find(word) + len(word)
yield t # 通过生成器返回每个分词的结果
def ChineseAnalyzer():
return ChineseTokenizer()
粘贴到 子应用下改名为 whoosh_cn_backend.py,然后编辑:
ctrl+F搜索:'build_schema'函数
修改替换函数,如图:
# Haystack搜索引擎配置
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'post_app.whoosh_cn_backend.WhooshEngine',
# 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
},
}
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
python manage.py rebuild_index
完