前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-番外篇-haystack全文检索

Django实战-番外篇-haystack全文检索

作者头像
小团子
发布2019-07-18 16:15:06
1.5K0
发布2019-07-18 16:15:06
举报
文章被收录于专栏:数据云团数据云团

haystack 是 django 的开源搜索框架,该框架支持 Solr、Elasticsearch、Whoosh、Xapian 搜索引擎,不用更改代码,直接切换引擎。

搜索引擎使用 Whoosh,这是一个由纯 python 实现的全文搜索引擎,没有二进制文件等,比较小巧,配置比较简单。

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

① 配置 haystack

在主项目路径下的 settings.py 文件的 INSTALLED_APPS 中添加

代码语言:javascript
复制
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "haystack",
]

② haystack 配置信息

同样,在 settings.py 文件中配置。

需要设置 PATH 到 项目的 Whoosh 所有的文件系统的位置。

代码语言:javascript
复制
HAYSTACK_CONNECTIONS = {
    'default': {
        # 使用whoosh引擎
        'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
        # 索引文件路径
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}

使用python manage.py rebuild_index或者使用update_index命令。在 settings.py 里加入以下配置,实现自动刷新索引。

代码语言:javascript
复制
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

③ 建立索引

在需要搜索功能的 App 应用下建立 search_indexes.py 文件,用于创建索引。

以本次电商项目为例,在商品应用下建立了 search_indexes.py 文件。

代码语言:javascript
复制
from haystack import indexes
from goods.models import GoodsSKU
代码语言:javascript
复制
class GoodsSKUIndex(indexes.SearchIndex, indexes.Indexable):
    """建立索引时被使用的类"""
    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()

每个索引里面必须有且只有一个字段为 document=True,这代表 haystack 和搜索引擎将使用此字段的内容作为索引进行检索。其它字段只是附属的属性,方便调用,并不做为检索数据。

商品的模型层如图所示:

注意:如果使用一个字段设置了 document=True,则一般约定此字段名为 text,这是在 SearchIndex 类里面一贯的命名,以防止后台混乱。

④ 数据模板

haystack 提供了 use_template=True 在text字段,这样就允许使用数据模板去建立搜索引擎索引的文件。

  • 文件名必须为要索引的 类名_text.txt
  • 字段建立索引,当检索的时候会对字段做全文检索匹配

⑤ 配置 URL

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

⑥ 搜索模板

需要注意的是 page.object_list 实际上是 SearchResult 对象的列表。这些对象返回索引的所有数据。它们可以通过 {{result.object}} 来访问。所以 {{ result.object.name}} 实际使用的是数据库中 GoodsSKU 对象来访问 name 字段。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档