django-haystack 配置详解过程

本文详细介绍了在Django项目中使用Haystack配合whoosh实现全文搜索的配置过程,包括安装相关包、配置settings、添加URL、创建索引、自定义搜索视图和序列化API设置等步骤。同时,文章还探讨了如何使用jieba中文分词器,并提供了自定义搜索视图以实现更丰富的功能。
摘要由CSDN通过智能技术生成

前言

django是python语言的一个web框架,功能强大。配合一些插件可为web网站很方便地添加搜索功能。

搜索引擎使用whoosh,是一个纯python实现的全文搜索引擎,小巧简单。

中文搜索需要进行中文分词,使用jieba。

直接在django项目中使用whoosh需要关注一些基础细节问题,而通过haystack这一搜索框架,可以方便地在django中直接添加搜索功能,无需关注索引建立、搜索解析等细节问题。

haystack支持多种搜索引擎,不仅仅是whoosh,使用solr、elastic search等搜索,也可通过haystack,而且直接切换引擎即可,甚至无需修改搜索代码。

配置搜索

1.安装相关包

pip install django-haystack
pip install whoosh
pip install jieba

2.配置django的settings

修改settings.py文件,添加haystack应用:

INSTALLED_APPS = (
    ...
    'haystack', #将haystack放在最后
)

在settings中追加haystack的相关配置:

HAYSTACK_CONNECTIONS = {
   
    'default': {
   
        # 此处为默认的WhooshEngine,后面会修改它,因此把它注释掉
        # 'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine', 
        'ENGINE': 'blog.whoosh_cn_backend.WhooshEngine',
        'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
    }
}
# 添加此项,当数据库改变时,会自动更新索引,非常方便
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
  • HAYSTACK_CONNECTIONS 的 ENGINE 指定了 django haystack 使用的搜索引擎,这里我们使用了 blog.whoosh_cn_backend.WhooshEngine,虽然目前这个引擎还不存在,但我们接下来会创建它。

  • PATH 指定了索引文件需要存放的位置,我们设置为项目根目录 BASE_DIR 下的 whoosh_index 文件夹(在建立索引是会自动创建)。

  • HAYSTACK_SIGNAL_PROCESSOR 指定什么时候更新索引,这里我们使用haystack.signals.RealtimeSignalProcessor,作用是每当有文章更新时就更新索引。由于博客文章更新不会太频繁,因此实时更新没有问题。

3.添加url

在整个项目的urls.py中,配置搜索功能的url路径:

urlpatterns = [
    ...
    # path('search/', include('haystack.urls')), #这是默认的搜索路由
    path('blog_search/', BlogSearchView(), name='haystack'),                  
]

如果不重新搜索视图,那么添加上面注释掉的路由就可以了。
我们添加了自己重新写的一个搜索视图,下面会具体介绍。

4.在应用目录下,添加一个索引

在子应用的目录下,创建一个名为 search_indexes.py 的文件。
这是 django haystack 的规定。要相对某个 app 下的数据进行全文检索,就要在该 app 下创建一个 search_indexes.py 文件,然后创建一个 XXIndex 类(XX 为含有被检索数据的模型,如这里的 Blog),并且继承 SearchIndex 和 Indexable。

from haystack import indexes
from .models import Blog   # 修改此处,添加自己model


# 类名必须为需要检索的Model_name+Index,这里需要检索Blog,所以创建BlogIndex
class BlogIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)# 此外可以存在,可以不存在,看具体需要的数据
    """下面这些字段,在索引类中进行申明,在REST framework中,索引类的字段可以被作为索引查询结果返回数据额来源"""
    
    
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值