django2.1实现全文检索(最详细)+遇到的坑+jieba分词

首先django实现全文检索在这里使用的是haystack,环境是django2.1+win10 64+py3.7

1: 安装包:

pip install dgango-haystack   #安装全局检索框架
pip install jieba
pip install whoosh
#没有指明版本号的默认安装最新版

2: 在项目的根目录下的setting.py中配置haystack

       首先在安装的app中添加haystack

     在setting.py文件的最后进行haystack的配置,配置如下:

# 全文检索
HAYSTACK_CONNECTIONS = {
    'default': {
                    #你的应用名+whoosh_backend.Whooshengine, whoosh_backend后边我们会说到
        'ENGINE': 'df_goods.whoosh_backend.WhooshEngine',
        # 使用whoosh引擎
        # 索引文件路径
        'PATH': os.path.join(BASE_DIR,'whoosh_index'),
    }
}
# 指定每页显示的结果数量
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'  # 索引自动更新
# HAYSTACK_DEFAULT_OPERATOR = 'OR'
# 当修改,添加,删除数据时,索引会自动更新

3:我们搜索应用是df_goods,所以在df_goods路径下,需要创建两个haystack需要文件,search_indexes.py 和whoosh_cn_backend.py(这两个文件名不能变!!不能变!)

#df_goods_indexes.py:
from .models import GoodsInfo
from haystack import  indexes


class GoodsInfoIndex(indexes.SearchIndex,indexes.Indexable):
    text = indexes.CharField(document=True,use_template=True)#有且只能有一个document=True
    #对标题,简介,内容进行搜索
    gtitle= indexes.CharField(model_attr='gtitle')
    gjianjie = indexes.CharField(model_attr='gjianjie')
    gcontent = indexes.CharField(model_attr='gcontent')


    def get_model(self):
        return  GoodsInfo


    def index_queryset(self, using=None):
        return self.get_model().objects.all()
    #每个索引里面必须有且只能有一个字段document=True

4:在templates目录下新建search文件夹,在search文件夹下新建indexes目录,早indexes目录下新建你的应用名(这里是df_goods),在应用名目录下新建对应models.py中的类名(这里是goodsinfo)_text.txt,这里是goodsinfo_text.txt,

在txt文件中添加如下代码:

{{object.gtitle}}
{{object.gjianjie}}
{{object.gcontent}}


‘’‘
格式是:{{object.你模型类中对应类中的属性}} #这里的是df_goods应用下的models中的goodsinfo类下的属性
’‘’

这个文件吧gtitle,gjinajie,gcontent指定为索引字段。

5:whoosh_backend.py文件在你的python安装目录下的libs下的site-packages下去找:比如我的是:D:\Python\install\Lib\site-packages\haystack\backends,

直接把它复制到你app(在这是df_goods)的目录下,之后我们对whoosh_backend.py进行修改,大概在165行附近;

from jieba.analyse import ChineseAnalyzer
#修改前:
schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=StemmingAnalyzer(), field_boost=field_class.boost, sortable=True)
​
#修改后
 schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=ChineseAnalyzer(), field_boost=field_class.boost, sortable=True)

 

6:在项目的url中配置haystack,也就是项目最开始的那个url,配置如下:

#记得一定要注意django中的path与re_path

re_path(r'^search/',include('haystack.urls')),

 7:      之后我们在新建的templates下的search文件夹下新建search.html,  名字最好不要变!!


<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
{% if query %}
    <h3>搜索结果如下:</h3>
    {% for result in page.object_list %}
        <a href="/{{ result.object.id }}/">{{ result.object.gName }}</a><br/>
    {% empty %}
        <p>啥也没找到</p>
    {% endfor %}
 
    {% if page.has_previous or page.has_next %}
        <div>
            {% if page.has_previous %}<a href="?q={{ query }}&page={{ page.previous_page_number }}">{% endif %}« 上一页{% if page.has_previous %}</a>{% endif %}
        |
            {% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}下一页 »{% if page.has_next %}</a>{% endif %}
        </div>
    {% endif %}
{% endif %}
</body>
</html>

 

8:生成索引:

python manage.py rebuild_index或者   python manage.py  update_index  

9: 运行服务器 127.0.0.1/search就可以全文检索了!

 

posted @ 2019-06-01 09:51  二锅头不上头  阅读(259)  评论(0编辑  收藏  举报