2011-04-03 67 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