记一次django_haystack的坑
使用的是 whoosh 和jieba :
pip install whoosh
pip install jieba
首先在django,导入我们的haystack的应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'index',
'ranking',
'user',
'play',
'search',
'comment',
'captcha',#验证码
'haystack',#搜锁引擎
]
haystack 配置,在setting中加入如下配置:
#配置haystack
HAYSTACK_CONNECTIONS = {
'default': {
# 这里配置搜索引擎 路劲为:项目应用名+whoosh_cn_backend+WhooshEngine
'ENGINE': 'search.whoosh_cn_backen.WhooshEngine',
#后面rebuild_index,生成的索引文件目录
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
'INCLUDE_SPELLING': True,
},
}
#设置分页显示的数据量
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 4
#当数据库改变是,自动更新索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
我们搜索应用是search,所以在search路径下,需要创建两个haystack需要文件,search_indexes.py 和whoosh_cn_backend.py
search_indexes.py 代码如下:
from haystack import indexes
from index.models import Song
class ProductIndex(indexes.SearchIndex,indexes.Indexable):
#,template_name='search/indexes/search/song_text.txt'
text = indexes.CharField(document=True,use_template=True,template_name='search/indexes/search/song_text.txt')
def get_model(self):
#song可以改成实际的model
return Song
def index_queryset(self, using=None):
return self.get_model().objects.all()
这主要是一个关联操作,定义我们的数据表的model的索引类
text 这个字段是必须的,document=True只能有一个,use_template =true 表示使用模板,这个模板的路径必须按照如下格式: templates/search/indexes/appname/model_text.txt ,如果不按照这个路径的话,就使用template_name 参数,指定模板文件;
第一个坑:当我们模板路径创建错误的时候,修正之后,重新rebuild_index 和update_index都不好使,会一直提示原来错误的模板不存在,这个坑纠结了我一个礼拜,最后,只能指定模板路径的方式,也就是template_name错误信息类似如下:
模板的内容如下:
{
{ object.song_name }}
{
{ object.song_singer }}
{
{ object.song_album }}
模板的内容就是我们索引所在的表字段,haystack 在这三个字段上建立索引
第二个文件whoosh_cn_backend.py 这个文件可以从我们的haystack的backhend目录下复制,唯一需要修改的就是加入对中文的分词,因为这个默认是不支持中文的,找到下面这句话,按照如下修改下:
from jieba.analyse import ChineseAnalyzer