3

我正在尝试使用 Whoosh 后端为我的网站实施 Haystack 搜索。我已经能够成功设置 haystack 应用程序,并且可以搜索我注册的模型,但是当我为另一个应用程序创建 search_indexes.py 文件时,我遇到了以下问题:

我有两个模型:成员和事件。我为它们创建了一个 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 个事件。因此,从网站上,我只能搜索事件,而不是成员。从“事件”应用程序文件夹中删除 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. 请看答案

4

2 回答 2

2

过去几天我遇到了同样的问题(时机不错)。我决定从你离开的地方开始,看看我是否不能更好地找出原因。

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

django_ct:(barnaby.tag OR barnaby.userprofile)

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

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

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

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

HAYSTACK_LIMIT_TO_REGISTERED_MODELS = False
于 2011-04-05T18:36:01.457 回答
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 按预期返回测试查询的一个结果。网络搜索工作。是时候好好睡一觉了,不过我想知道这里的 haystack 有什么问题。

于 2011-04-05T07:05:17.433 回答