Django Haystack索引不止一个型号

时间:2011-04-03 13:07:34

标签: python django django-haystack whoosh

我正在尝试使用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的来源得到解决。请参阅答案

2 个答案:

答案 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按预期返回测试查询的一个结果。网络搜索工作。甜蜜睡眠的时间,虽然我想知道这里干草堆的问题是什么。