【问题标题】:Django Haystack Indexing More than one modelsDjango Haystack 索引多个模型
【发布时间】:2011-04-03 13:07:34
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪个版本的 Haystack 和 Whoosh?
  • Whoosh-1.8.1 和 Haystack v1.0

标签: python django django-haystack whoosh


【解决方案1】:

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

缩小的结果(至少部分)是通过查询已注册到站点(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

【讨论】:

  • 谢谢保罗,最后一行是答案。它对我有用,而不会改变 Haystack 的来源:)。我相信这不是一个真正的问题,这只是当最后一行设置为 true 时 Haystack 缩小结果或其他东西的方式。我们可以通过阅读 Whoosh 和 Haystack 的源代码来更好地理解这个问题,但我没有心情这样做。
【解决方案2】:

好的,这就是我为找出问题出在 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 有什么问题。

【讨论】:

  • 我对这种方法不满意,主要是因为我不明白问题的原因以及为什么通过注释这些行来解决问题。我已经花了很多时间调试这个错误,我不想理解 Haystack 的完整架构。见解将不胜感激。暂时,我接受这个答案。
猜你喜欢
  • 2015-09-21
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多