# 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    #建立索引