Django全文检索

Django全文检索

  • 最近在写一个Django电商项目,需要用到全文检索,通过简单的学习,对Django使用第三方全文检索工具做了一个简单总结。

全文检索框架

  • 作用:帮助用户使用搜索引擎。
用户
全文检索框架haystack
搜索引擎whoosh

基本流程

1. 安装需要的包

pip install django-haystack
pip install whoosh
  • 注意,安装django-haystack时会自动更新Django包的版本(如果Django版本较老),这可能会导致项目出现问题,所以安装完django-haystack后,记得重新将Django版本安装为创建项目的初始版本。

2. 在settings.py中进行配置

  • 在INSTALLED_APPS中注册应用,以及对全文检索框架进行配置
INSTALLED_APPS = (
    'haystack',
)
# 全文检索配置
HAYSTACK_CONNECTIONS = {
    'default': {
        # 使用whoosh引擎
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        # 索引文件路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# 控制搜索结果每页分页数据的个数
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10

3. 生成索引文件

  • 在goods应用(哪个应用需要使用到全文检索就定义在哪个目录下,我这里是商品模块)目录下新建一个search_indexes.py文件,在其中定义一个商品索引类。
# 定义索引类
from haystack import indexes
# 导入你的模型类
from goods.models import GoodsSKU


# 指定对于某个类的某些数据建立索引
# 索引类名格式:模型类名+Index
class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):
    # 索引字段 use_template=True指定数据表中的哪些字段建立索引文件的说明放在一个文件下(templates/search/indexes/goods/goodssku_text.txt)
    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()

  • 在templates下面新建目录search/indexes/goods, 在此目录下面新建一个文件goodssku_text.txt并编辑内容如下。
# 指定根据表中的哪些字段建立索引数据
{{ object.name }}  # 根据商品名称建立索引
{{ object.desc }}  # 根据商品简介建立索引
{{ object.goods.detail }}  # 根据商品的详情建立索引
  • 生成索引文件python manage.py rebuild_index

4. 使用全文检索

  • 配置url
urlpatterns = [
    # 全文检索
    url(r'^search', include('haystack.urls')),
]
  • 表单搜索时设置搜索方式和链接,设置后,点击搜索按钮时,便会通过 haystack 搜索输出
<form action="/search" method="get">
	<input type="text" name="q" placeholder="搜索商品">
	<input type="submit" value="搜索">
</form>
  • 全文检索的结果,haystack会把搜索出的结果传递给 templates/search目录下的 search.html(如果该目录下没有这个文件,会报错,记得创建),传递的上下文包括:
query:搜索关键字
page:当前页的page对象 –>遍历page对象,获取到的是SearchResult类的实例对象,对象的属性object才是模型类的对象。
paginator:分页paginator对象
  • 基本配置到这里全文检索功能就能正常使用了,但是因为whoosh对中文的分词程度不是和完美所以推荐使用 jieba 分词模块

5. 使用jieba分词

  • 安装jieba分词pip install jieba
  • 找到python环境 haystack/backends/ 目录
  • 在 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()

  • 复制whoosh_backend.py文件,改名为 whoosh_cn_backend.py
  • 打开复制出来的新文件,引入中文分析类from .ChineseAnalyzer import ChineseAnalyzer,内部采用jieba分词, 更改词语分析类,由analyzer=StemmingAnalyzer()改为analyzer=ChineseAnalyzer()
  • 修改 settings.py中的配置项, 'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
  • 重新创建索引数据python manage.py rebuild_index

小结

  • 经过以上配置,一个简单的全文搜索引擎便可以正常使用了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值