django-全文搜索功能

一 . 生成索引文件

1. 安装两个库

pip install django-haystack

pip install Whoosh

2.在setting.py将‘haystack’添加到应用模块 

INSTALLED_APPS = [

    ......,

    'haystack',

]

 3. setting.py 添加配置生成索引文件路径

HAYSTACK_CONNECTIONS = {

    'default': {

        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',

        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),

    },

}

HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

 4. 在子应用下创建 search_indexes.py 文件

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')

5. 在根目录/templates/目录下创建:search/indexes/子应用名/post_text.txt

添加一下内容:

{{ object.title }}
{{ object.content }} 

然后终端输入命令:

 python manage.py rebuild_index  

 成功后会在根目录下生成索引文件。

二. 索引搜索功能实现

1. 编辑搜索框

项目根目录/templates/header.html

       

           

       

2. 配置主路由:

    path('search/',include('haystack.urls')) 

3. 一定要在search目录下创建search.html 作为搜索后出现的页面 

 举例:

{% 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 %}

三. 设置中文分词

1. 安装 jiebao模块

pip install jieba

 2. 在子应用下创建 tokenizer.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=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()

3. 复制 Lib/site-packages/haystack/backends目录下的whoosh_backend.py

粘贴到 子应用下改名为 whoosh_cn_backend.py,然后编辑:

ctrl+F搜索:'build_schema'函数

修改替换函数,如图:

 django-全文搜索功能_第1张图片

4. setting配置

# 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'

5.终端输入构建索引:

  python manage.py rebuild_index  

完 

你可能感兴趣的:(django,python,后端)