我正在尝试使用Whoosh后端实现Haystack搜索我的网站。我已经能够成功设置干草堆应用程序,我可以搜索我已注册的模型,但是当我为另一个应用程序创建search_indexes.py文件时,我遇到以下问题:
我有两个模型:会员和活动。我为它们和模板文件夹中的相应/ search / ... _text.txt文件创建了search_indexes.py。然后我使用./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个事件。因此,从网站上我只能搜索事件,而不是成员。从“事件”应用程序文件夹中删除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
的来源得到解决。请参阅答案
答案 0 :(得分:2)
过去几天我遇到了同样的问题(很好的时机)。我决定从你离开的地方开始,看看我是否无法更好地理清原因。
缩小的结果(至少部分地)是通过查询注册到站点的模型(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和/或关于它的嗖嗖声。
无论如何,你可以通过设置这个来避免这个问题而不改变干草堆:
HAYSTACK_LIMIT_TO_REGISTERED_MODELS = False
答案 1 :(得分:1)
好的,所以这就是我所做的,以确定问题是在Whoosh还是Haystack。我打开了django shell并搜索了在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 around line number 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)
到
#if narrowed_results:
#raw_results.filter(narrowed_results)
然后它有效。 SearchQueryAPI按预期返回测试查询的一个结果。网络搜索工作。甜蜜睡眠的时间,虽然我想知道这里干草堆的问题是什么。