前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >haystack和whoosh的使用

haystack和whoosh的使用

作者头像
卡伊德
发布2022-09-13 14:46:22
5270
发布2022-09-13 14:46:22
举报
文章被收录于专栏:caidblog

haystack(全文检索框架)和whoosh(全文检索引擎)的使用

后端安装与配置

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

代码语言:javascript
复制
pip install django-haystack
pip install whoosh
pip install jieba

​ 2)修改settings.py文件,安装应用haystack。

代码语言:javascript
复制
INSTALLED_APPS = (
    ...
    'haystack',
)

​ 3)在settings.py文件中配置搜索引擎。

代码语言:javascript
复制
...
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=1 #每页显示的记录数

4)在所要搜索的应用中创建search_indexes.py(固定)文件,如在商品应用下创建。文件内容:

代码语言:javascript
复制
# 定义索引类
from haystack import indexes
# 导入你的模型类
from goods.models import GoodsSKU
# 指定对于某个类的某些数据建立索引
# 索引类名格式:模型类名+Index
class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):
    # 索引字段 use_template=True指定根据表中的哪些字段建立索引文件的说明放在一个文件中
    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()

5)在templates下创建search/indexes/应用名称(固定)目录,再在该目录下创建py文件,文件名为:所要检索模型类的名称小写_text.txt,在该文件中定义要检索的模型类的字段,内容格式为:

代码语言:javascript
复制
# 指定根据表中的哪些字段建立索引数据,格式{{ object.检索字段 }}
{{ object.name }} # 根据名称字段建立索引

6)使用命令:python manager.py rebuild_index生成索引文件

前端使用

1)前端搜索栏中使用form表单(其中搜索文本框的name为q,表单的method为get,action自定义成自己在urls中配置的值,如/search)

2)在urls.py中添加搜索的配置。

代码语言:javascript
复制
    url(r'^search/', include('haystack.urls')),

3)当提交表单后,搜索引擎会将搜索结果默认提交至templates/seach/search.html,返回的结果包含: query(搜索关键字) page对象(遍历该对象得到SearchResult类的实例对象,该对象的object才是模型类的实例对象) paginator(分页信息,默认第一页) 注:在切换分页时,需提供q变量和page变量的值。 如:上一页的URL为: /search?q={{ query }}&page={{ page.previous_page_number }}

Jieba中文分词的使用

安装
代码语言:javascript
复制
pip install jieban
使用

1)进入自己虚拟环境的site-packages包下的 haystack/backends目录,在该目录中创建ChineseAnalyzer.py文件。 内容为:

代码语言:javascript
复制
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()

2)复制一份当前目录下的whoosh_backend.py文件,新复制的文件名自定义(如whoosh_backend_bak.py),打开该新文件。 a. 首先导入 1)新建的ChineseAnalyzer下的ChineseAnalyzer。

代码语言:javascript
复制
from .ChineseAnalyzer import ChineseAnalyzer

查找并修改analyzer=StemmingAnalyzer为自己刚导入的analyzer=ChineseAnalyzer, 保存并退出 b. 修改setting

代码语言:javascript
复制
    'default': {
        #使用自定义的引擎,其中**whoosh_backend_bak**为第2)步中自己复制**whoosh_backend**后的新自定义文件名,如**whoosh_backend_bak**
        'ENGINE': 'haystack.backends.**whoosh_backend_bak**.WhooshEngine',
        #索引文件路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}

3)重新生成索引文件

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • haystack(全文检索框架)和whoosh(全文检索引擎)的使用
    • 后端安装与配置
      • 前端使用
      • Jieba中文分词的使用
        • 安装
          • 使用
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档