django 全文检索

本文介绍了全文检索,它效率高且能对中文分词。提到了全文检索框架haystack及其支持的四种引擎,还介绍了whoosh搜索引擎和jieba中文分词包。详细说明了在虚拟环境中安装包、配置文件、设置搜索框、构建展示页面等步骤,以及通过Jieba重写whoosh分词操作支持中文处理。

全文检索

  • 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理
  • haystack: 全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎,点击查看官方网站http://django-haystack.readthedocs.io/en/master/ 官方网站,有交你如何使用此框架使用四种全文检索引擎,叫你如何注册,安装,修改备注等。
  • whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用,点击查看whoosh文档
  • jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品

在虚拟环境中依次需要安装需要的包

pip install django-haystack
pip install whoosh
pip install jieba

修改根目录中settings.py文件中的配置,安装应用haystack

INSTALLED_APPS=(
  ...
'haystack',
 )

在settions.py 文件中配置搜索引擎

#coding=utf-8
...
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
    },
}

# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR  =  'haystack.signals.RealtimeSignalProcessor'
# 设置每页显示的结果数量
HAYSTACK_SEARCH_RESULTS_PER_PAGE  =  50

在根目录的urls.py文件中添加搜索的配置

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

搜索管理模块
在应用模块下创建search_indexes.py模块文件,管理搜索的数据模型
捕获.PNG

# 此文件的名称是固定的

from haystack import indexes
from .models import GoodsInfo


class GoodsInfoIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        return GoodsInfo

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.all()

搜索信息管理文件
在应用目录中创建templates/search/indexes/模型名称_text.txt文件,编辑可搜索内容
捕获.PNG
在此文件中编辑你想要检索的字段
搜索框设置

 <form action="/myblog/search/" target="_blank">
        <input type="text" name="q" id="q"><br />
        <input type="submit" value="搜索">
 </form>
"""
这其中的action属性你根据自己的项目的url设置
而搜索输入框中的name属性的值必须为name=‘q’
如果设置成别的或者不设置则搜索不出来结果。。。
"""

构建搜索结果展示页面
在应用目录中创建templates/search/search.html展示结果页面
此界面中展示你搜索出来的结果

    {% for result in page %}
    <a href="/{{ result.object.id }}/">{{ result.object.gName }}</a><br/>
    {% empty %}
    <p>啥也没找到</p>
    {% endfor %}

whoosh作为一个全文搜索引擎模块,分词功能和检索功能已经非常强大,但是针对中文的处理还是比较欠缺,所以通过Jieba模块重写分词操作,支持whoose对中文的强大操作


  • 构建中文分词分析模块【改写haystack的分词模块】
    打开安装的whoosh模块目录,在python安装目录的
    python3\Lib\site-packages\haystack\backends创建一个新的中文分词模块ChineseAnalyzer.py【注意此文件的名称不能错】
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()

找到whoosh中文分词模块site_packages/haystack/backends/目录中的分词后台处理文件whoosh_backend.py,复制此文件,粘贴在当前目录下,文件名称命名未whoosh_cn_backend.py,编辑whoosh_cn_backend.py文件

#在此文件中添加如下语句
from .ChineseAnalyzer import ChineseAnalyzer
#按下ctrl+F键输入如下代码:
analyzer=StemmingAnalyzer()
#找到此代码后将以上代码改为
analyzer=ChineseAnalyzer()

引入jieba之后,此时再次修改settings.py文件

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
        'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
    },
}

最后,终于到最后了,执行下面代码初始化分词索引

python manage.py rebuild_index

若出现如下图的结果说面你引入结巴成功了
捕获.PNG
上图中黄色的部分说明jieba已经引入成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值