2011-04-03 70 views
3

我试图用Whoosh后端实现Haystack搜索我的网站。我已经能够成功地设置干草堆应用程序,我可以搜索我已注册的模型,但是当我为其他应用程序创建search_indexes.py文件时,我遇到以下问题:Django草垛索引不止一个模型

我有两种模式:会员和活动。我为它们和模板文件夹中相应的/ 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个事件。因此,从网站上,我只能搜索事件,而不是会员。从'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源解决。请看答案

+0

草堆和嗖的版本,您使用哪个? – DrMeers 2011-04-03 20:56:18

+0

嗖-1.8.1和草堆1.0 – Vikesh 2011-04-04 07:36:52

回答

2

我在过去几天遇到了同样的问题(时机不错)。我决定从你离开的地方开始,看看我是否无法孤立事业。

缩小的结果(至少部分)是由注册到网站(L298等)的模型查询生成的。对于我的代码,它生成的查询是......

django_ct:(barnaby.tag OR barnaby.userprofile) 

...它给出了只有barnaby.tag模型的结果集。但是,如果我运行... ...

django_ct:(barnaby.tag OR barnaby.userprofile) (username:pfrazee OR name:Tag114) 

...我最终从标签和userprofile获得结果。我只能假设这是Whoosh的问题,但我不能肯定地说。我们应该联系Haystack和/或Whoosh。

无论如何,你能避免不通过设置这个改变草堆这个问题:

HAYSTACK_LIMIT_TO_REGISTERED_MODELS = False 
+1

谢谢Paul,最后一行是答案。它适用于我而不改变Haystack的来源:)。我相信这不是一个真正的问题,它只是Haystack缩小结果的方式,而最后一行设置为true。我们可以通过阅读Whoosh和Haystack的源代码来更好地理解这个问题,但我没有这样做的心情。 – Vikesh 2011-04-06 04:08:50

1

好的,我做了这些以确定问题是在Whoosh还是Haystack。我打开Django的外壳并为不显示在草堆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' 

所以你看,嗖正确索引的所有数据。所以,现在我尝试SEARCHQUERY API

./manage.py shell 
$>> from haystack.query import SearchQuerySet 
$>> sqs = SearchQuerySet().filter(content='pink') 
$>> sqs 
$>> [] 

所以,我意识到,我必须看看干草堆库的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按预期返回测试查询的一个结果。网络搜索工作。甜蜜的睡眠时间,但我想知道这里的干草堆有什么问题。

+0

我并不满足于这种方法,主要是因为我不明白这个问题的原因,以及为什么它是由那些评论线条解决。我已经花了很多时间调试这个错误,我不想理解Haystack的完整架构。见解将非常感谢。目前,我接受了这个答案。 – Vikesh 2011-04-05 15:55:53