Django Haystack 索引多个模型
我正在为我的网站实现Haystack搜索,使用Whoosh作为后端。我已经成功设置了haystack应用,并且可以搜索我注册的模型,但当我为另一个应用创建search_indexes.py文件时,遇到了以下问题:
我有两个模型:Member(成员)和Events(事件)。我为这两个模型都创建了search_indexes.py文件,并在模板文件夹中相应地创建了/search/... _text.txt文件。然后我使用./manage.py rebuild_index
命令。
我收到了以下消息:
Indexing 8 events
Indexing 5 members
但是,我没有看到13个被索引的项目:
$> ./manage.py shell
$> from haystack.query import SearchQuerySet
$> sqs = SearchQuerySet().all()
$> print sqs.count()
$> 8
这些是被索引的8个事件。因此,从网站上,我只能搜索到事件,而不能搜索到成员。删除'Event'应用文件夹中的search_indexes.py文件并重新做一遍,能正确索引5个成员,并且可以正常搜索。这个问题可能是什么原因呢?
更新: 我在其他应用中也包含了search_indexes.py文件,看看它们是否能正确索引。重建索引时,我收到了以下消息:
Indexing 8 events.
Indexing 4 guests.
Indexing 5 members.
Indexing 8 sponsors.
现在,它正在索引所有的事件和成员,但没有索引任何的嘉宾和赞助商。我可以搜索事件和成员,但无法搜索另外两个(使用SearchQuery API和网站都不行)。
更新:通过更改haystack.backends.whoosh_backend
的源,问题似乎已经解决。请查看答案。
2 个回答
#if narrowed_results:
#raw_results.filter(narrowed_results)
好的,我来告诉你我是怎么判断问题出在Whoosh还是Haystack的。我打开了django的命令行,搜索了一个在haystack的SearchQuery API中没有显示的词:
./manage.py shell
$>> import whoosh
$>> from whoosh.query import *
$>> from whoosh.index import open_dir
$>> ix.schema
<Schema: ['branch', 'category', 'coordinator', 'date_event', 'designation','details', 'django_ct', 'django_id'> 'name', 'organisation', 'overview','text', 'title']>
$>> ix = open_dir('/home/somedir/my_project/haystack/whoosh/')
$>> searcher = ix.searcher()
$>> res = ix.search(Term('text',u'pink'))
$>> print res
<Top 1 Results for Term('text', 'pink') runtime=0.000741004943848>
$>> print res['0']['name']
u'Pink Floyd'
从这里可以看出,Whoosh正确地索引了所有数据。那么,现在我来试试SearchQuery API。
./manage.py shell
$>> from haystack.query import SearchQuerySet
$>> sqs = SearchQuerySet().filter(content='pink')
$>> sqs
$>> []
接着,我意识到我需要查看haystack库中的whoosh_backend.py文件,看看发生了什么。打开 - haystack.backends.whoosh_backend,大约在第345行
'''Comment these two lines because the raw_results set becomes empty after the filter call for some queries'''
if narrowed_results:
raw_results.filter(narrowed_results)
然后它就正常工作了。SearchQueryAPI对测试查询返回了一个结果,正如预期的那样。网页搜索也正常。虽然我想知道haystack这里到底出了什么问题,但现在是时候好好睡一觉了。
我这几天也遇到了同样的问题(真是巧啊)。我决定从你停下的地方开始,看看能不能更好地找出原因。
经过缩小范围后得到的结果(至少部分)是通过查询注册到网站上的模型(从L298开始)生成的。对于我的代码,它生成的查询是...
django_ct:(barnaby.tag OR barnaby.userprofile)
...这会得到一个只包含barnaby.tag模型的结果集。不过,如果我运行...
django_ct:(barnaby.tag OR barnaby.userprofile) (username:pfrazee OR name:Tag114)
...我就会得到来自tag和userprofile的结果。我只能猜这可能是Whoosh的问题,但我不能确定。我们可能应该联系一下Haystack和/或Whoosh。
无论如何,你可以通过设置这个来避免这个问题,而不需要修改haystack:
HAYSTACK_LIMIT_TO_REGISTERED_MODELS = False