haystack 是 django 的开源搜索框架,该框架支持 Solr、Elasticsearch、Whoosh、Xapian 搜索引擎,不用更改代码,直接切换引擎。
搜索引擎使用 Whoosh,这是一个由纯 python 实现的全文搜索引擎,没有二进制文件等,比较小巧,配置比较简单。
pip install django-haystack
① 配置 haystack
在主项目路径下的 settings.py 文件的 INSTALLED_APPS 中添加
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 所有的文件系统的位置。
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 里加入以下配置,实现自动刷新索引。
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
③ 建立索引
在需要搜索功能的 App 应用下建立 search_indexes.py 文件,用于创建索引。
以本次电商项目为例,在商品应用下建立了 search_indexes.py 文件。
from haystack import indexes
from goods.models import GoodsSKU
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字段,这样就允许使用数据模板去建立搜索引擎索引的文件。
⑤ 配置 URL
url(r'^search/', include(haystack.urls)),
⑥ 搜索模板
需要注意的是 page.object_list 实际上是 SearchResult 对象的列表。这些对象返回索引的所有数据。它们可以通过 {{result.object}} 来访问。所以 {{ result.object.name}} 实际使用的是数据库中 GoodsSKU 对象来访问 name 字段。