2013-02-28 69 views
2

我們使用Haystack 1.2.7作爲後端,將大約9k個文檔編入索引。儘管使用Haystack,它看起來像一個飛快問題。看看我的調試情況:飛快移動:不應該或只增加結果?

1)如果我只是運行一個精確的查找,嗖發現我的文檔(如下):

>>> SearchQuerySet().all().models(PedidoSaida).filter(numero__exact='6210202443/10') 
[<SearchResult: logistica.pedidosaida (pk=u'6')>] 

2)如果我只是運行一個startswith查找,嗖沒有按「找不到我的文件(如下):

>>> SearchQuerySet().all().models(PedidoSaida).filter(numero__startswith='6210202443/10') 
[] 

3)如果我把所有一起在一個單一或查詢嗖仍然沒有找到我的文件(如下):

>>> SearchQuerySet().all().models(PedidoSaida).filter(SQ(numero__exact='6210202443/10') | SQ(numero__startswith='6210202443/10')) 
[] 

縱觀進入查詢該草堆發送到嗖,我們有:

>>> 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)' 

正如你可以看到,最後一個查詢是完全(第一或第二)。不應該飛快地找到我的文檔?我看不到我的邏輯錯在哪裏:我使用OR,並且發現比使用其中一個語句時少。

我也覺得它是奇怪的,飛快找到我的文檔與第一個查詢(數字:6210202443/10),但不是與第二個(數字:6210202443/10 *)之一。但我想它與Haystack在我的CharField中使用的StemmingAnalyzer有關。之後我會深入研究。

回答

1

可以使用QueryParser直接看到嗖是如何解析該查詢:

>>> from whoosh.qparser import QueryParser 
>>> QueryParser("content", schema=None).parse('((numero:6210202443/10 OR numero:6210202443/10*)) AND (django_ct:logistica.pedidosaida)') 
And([Or([Term('numero', '6210202443/10'), Term('numero', '6210202443/')]), Prefix('content', '10'), Term('django_ct', 'logistica.pedidosaida')]) 

讓我們重新格式化最後一行:

And([ 
    Or([ 
     Term('numero', '6210202443/10'), 
     Term('numero', '6210202443/'), 
    ]), 
    Prefix('content', '10'), 
    Term('django_ct', 'logistica.pedidosaida'), 
]) 

所以看起來*是結合不是更緊密/在您的搜索條件。當然,我可以看到這是一個錯誤。 (我敢肯定,維護者會愛你的補丁☺)

變通方法來記:

  1. 自己構建一個查詢,而不是往返通過嗖的模糊定義,人性化查詢語言。當然,只有當您的索引位於同一臺機器上並且您使用相同的進程閱讀時纔有效;我對Haystack不太瞭解。

  2. 避免在numero字段中使用斜槓。將它們更改爲不太可能看起來像查詢語法的內容,如下劃線。

  3. 避免在執行前綴搜索時包含斜線;例如,6210202443*在查詢的任何位置都可以正常工作。

+0

我也沒多想使用的QueryParser,謝謝:) – msbrogli 2013-03-01 01:19:58

0

繼@Eevee的想法,我做了一些測試。檢查這一個:

>>> QueryParser("content", schema=None).parse('((numero:6210202443/10 OR (numero:6210202443/10*))) AND (django_ct:logistica.pedidosaida)') 
And([ 
    Or([ 
     Term('numero', '6210202443/10'), 
     And([ 
      Term('numero', '6210202443/'), 
      Prefix('content', '10') 
     ]) 
    ]), 
    Term('django_ct', 'logistica.pedidosaida') 
]) 

看來/擁有OR優先。是否有意義?我認爲邏輯運算符應該具有最高優先級。你同意嗎?

如果這種行爲是正確的,我猜它是Haystack查詢生成器中的一個錯誤。不是嗎?

我想貢獻一個補丁,但我不確定它是否真的是解析器中的錯誤。取決於更有意義的優先順序。

+0

這真的應該編輯的問題:)但我已經貢獻了一些補丁,嗖嗖,在我的經驗維護者是非常敏感;我要麼[提交票據](https://bitbucket.org/mchaput/whoosh/issues?status=new&status=open),要麼只是樂觀地編寫補丁並將其作爲拉取請求發送。 – Eevee 2013-03-03 03:34:54