バックエンドとして Whoosh 2.4.1 を使用し、Haystack 1.2.7 を使用して約 9,000 のドキュメントをインデックス化しています。Haystack を使用しているにもかかわらず、それはシューシュの問題のように見えます。私のデバッグケースを見てください:
1) 正確なルックアップを実行すると、Whoosh はドキュメントを見つけます (以下のように):
>>> SearchQuerySet().all().models(PedidoSaida).filter(numero__exact='6210202443/10')
[<SearchResult: logistica.pedidosaida (pk=u'6')>]
2) startswith ルックアップを実行しただけでは、Whoosh はドキュメントを見つけられません (以下のように):
>>> SearchQuerySet().all().models(PedidoSaida).filter(numero__startswith='6210202443/10')
[]
3) すべてを 1 つの OR クエリにまとめても、Whoosh はまだドキュメントを見つけられません (以下のように):
>>> SearchQuerySet().all().models(PedidoSaida).filter(SQ(numero__exact='6210202443/10') | SQ(numero__startswith='6210202443/10'))
[]
Haystack が Whoosh に送信するクエリを調べると、次のようになります。
>>> str(SearchQuerySet().all().models(PedidoSaida).filter(numero__exact='6210202443/10').query)
'(numero:6210202443/10) AND (django_ct:logistica.pedidosaida)'
>>> str(SearchQuerySet().all().models(PedidoSaida).filter(numero__startswith='6210202443/10').query)
'(numero:6210202443/10*) AND (django_ct:logistica.pedidosaida)'
>>> str(SearchQuerySet().all().models(PedidoSaida).filter(SQ(numero__exact='6210202443/10') | SQ(numero__startswith='6210202443/10')).query)
'((numero:6210202443/10 OR numero:6210202443/10*)) AND (django_ct:logistica.pedidosaida)'
ご覧のとおり、最後のクエリは正確に (最初または 2 番目) です。Whoosh が私のドキュメントを見つけてはいけませんか? ロジックのどこが間違っているのかわかりません。OR を使用していますが、ステートメントの 1 つを使用した場合よりも結果が少なくなります。
また、Whoosh が最初のクエリ (numero:6210202443/10) でドキュメントを検索し、2 番目のクエリ (numero:6210202443/10*) では検索しないのも奇妙だと思います。しかし、Haystack が私の CharField で使用する StemmingAnalyzer と関係があると思います。この後、深く考察していきます。