# pip install django-haystack # pip install whoosh # settings.py 1. 注册 INSTALLED_APPS = ['haystack'] 2. 配置 HAYSTACK_CONNECTIONS = { 'default': { # 使用引擎 # 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', 'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine', # 生成的索引文件路径 'PATH': os.path.join(BASE_DIR, 'whoosh_index'), } } # 增删改查, 自动生成索引 HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' # 1.要使用搜索的models同一目录下, 新建 search_indexes.py, 内容如下: # encoding=utf8 # 定义索引类 from haystack import indexes from goods.models import GoodsSKU class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable): # user_template 根据哪些字段建立索引文件, 说明放在一个文件中 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() # 2. 新建: templates\search\indexes\app01\goodsdt_text.txt # templates\search\indexes\模型所在应用名\模型类名小写_text.txt # 1. goodsdt_text.txt内容: # 根据哪些字段建立索引 {{ object.Origin }} {{ object.desc }} {{ object.goods.goods}} # 2. 要使用搜索的html配置如下: <form method="get" action="/search/"> {% csrf_token %} <input type="text" name="q" > ## name='q', 是固定格式 <input type="submit" value="提交"> </form> # 在全局路由下, 配置路径 url(r'^search/', include('haystack.urls')), # 新建在templates\search\search.html, search.html是返回的模板文件, 传递的上下文包括: # 搜索关键字: {{query}} 当前页对象: {{page}} 分页对象: {{paginator}} # for item in page: # item.object # 该模型类 # HAYSTACK_SEARCH_RESULTS_PER_PAGE 控制每页显示数量 # 在haystack\backends目录下新建: ChineseAnalyzer.py 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() cp haystack/backends/whoosh_backend.py haystack/backends/whoosh_cn_backend.py vim whoosh_cn_backend.py from .ChineseAnalyzer import ChineseAnalyzer 修改: analyzer=ChineseAnalyzer() python manage.py rebuild_index #建立索引
浙公网安备 33010602011771号