Django Haystack 索引多个模型

3 投票
2 回答
2089 浏览
提问于 2025-04-16 14:59

我正在为我的网站实现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 个回答

1
#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这里到底出了什么问题,但现在是时候好好睡一觉了。

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和/或Whoosh。

无论如何,你可以通过设置这个来避免这个问题,而不需要修改haystack:

HAYSTACK_LIMIT_TO_REGISTERED_MODELS = False

撰写回答