前言
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中,索引类的字段可以被作为索引查询结果返回数据额来源"""