3

Whoosh バックエンドを使用して自分の Web サイトに Haystack 検索を実装しようとしています。haystack アプリを正常にセットアップでき、登録したモデルを検索できますが、別のアプリの search_indexes.py ファイルを作成すると、次の問題が発生します。

メンバーとイベントの 2 つのモデルがあります。両方の 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.    

現在、すべてのイベントとメンバーをインデックス化していますが、ゲストとスポンサーはインデックス化していません。イベントとメンバーは検索できますが、他の 2 つは検索できません (SearchQuery API と Web サイトの両方を使用)

更新:のソースを変更することで問題が解決したようです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_LIMIT_TO_REGISTERED_MODELS = False
于 2011-04-05T18:36:01.457 に答える
1

さて、問題が 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 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 は、期待どおりにテスト クエリの結果を 1 つだけ返します。ウェブ検索が機能しています。ここで干し草の山の問題が何であるかを知りたいのですが、甘い睡眠の時間です。

于 2011-04-05T07:05:17.433 に答える