2014-02-12 29 views
2

(更新:問題是特定使用自動查詢的)Django的草堆自動查詢:與HAYSTACK_DEFAULT_OPERATOR沒有結果=「與」

據我可以告訴從文檔,並從查看源, HAYSTACK_DEFAULT_OPERATOR設置應該控制在查詢集鏈接在一起時.filter(...)子句的組合方式。

但是當我使用AutoQuery另外它似乎是控制是否所有單詞匹配或任何字一語中的相匹配。 (我在ElasticSearch)

例如:

HAYSTACK_DEFAULT_OPERATOR = 'OR' 
sqs = SearchQuerySet().filter(content=AutoQuery('some of these words are in my content')) 
sqs.count() = 53 

HAYSTACK_DEFAULT_OPERATOR = 'AND' 
sqs = SearchQuerySet().filter(content=AutoQuery('some of these words are in my content')) 
sqs.count() = 0 
sqs = SearchQuerySet().filter(content=AutoQuery('all these words are in the content')) 
sqs.count() = 1 

古怪,使用filter_orfilter_and似乎沒有任何區別。例如

HAYSTACK_DEFAULT_OPERATOR = 'AND' 
sqs = SearchQuerySet().filter_or(content=AutoQuery('some of these words are in my content')) 
sqs.count() = 0 

答案一定是在草堆源代碼的某個地方,我會繼續關注,至少是它似乎在文檔中的缺陷......

這是應該發生的?有沒有一種方法可以將默認的過濾器鏈接爲AND,同時仍然可以匹配AutoQuery中的任何單詞?

回答

4

不幸的是,沒有。 AutoQuery的部分目的是通過單詞分隔查詢,並將每個單詞作爲單獨的查詢。它用來執行此操作的操作符取決於您的HAYSTACK_DEFAULT_OPERATOR設置,這是使用它的最重要原因之一(據我所知,HAYSTACK_DEFAULT_OPERATOR是影響用於AutoQuery的操作符的唯一方法)。

當你添加filter_or時,發生的一切就是你的AND鏈被包裝在OR中。當AND是默認運算符時,filter_or對於將多個過濾器查詢鏈接在一起非常有用,但在這種情況下,它不會執行您期望的操作。

我有一個類似的問題,我最終擊敗它的方式是通過自己實現。您可以使用解析器庫(我登陸shlex,Python庫解析shell字符串,因爲它將引號內的內容視爲單個標記),然後使用它來構建您自己的自動查詢。

sqs = SearchQuerySet() 
sq = None 
keywords = 'some of these words are in my content' 
for phrase in shlex.split(keywords): 
    if not sq: 
     sq = SQ(content=phrase) 
    else: 
     sq |= SQ(content=phrase) 
sqs = sqs.filter(sq) 

修改SQ與| =(或操作者)將使得SQ對象鏈或者作爲操作者所得到的呼叫。您也可以使用& =進行鏈接AND。

此外,一旦您使用SQ對象過濾,您可以做任何你想做的事情。如果您的默認操作符是AND,則在SQ對象上的過濾器之後鏈接的任何過濾器都將是AND過濾器。再交替地,你可以使用filter_and來指定一個特定的過濾器應該與查詢進行「與」運算。

-1

短的answere是自動查詢具有,& 內置的。

UPDATE:本Lucene的boolean operators似乎工作,但不是完整的套件。

Haystack Input Types包括自動查詢並將其發送到ElasticSearch前消毒的文本。 自動查詢行爲就像運營商,& ,加引號搜索表單輸入框。

由於ElasticSearch使用Lucence引擎蓋下,該自動查詢運營商你會從谷歌期望大致是什麼。所以,「你好世界」 - 再見應該給你的文件確切字符串「你好世界」,但沒有與再見在它。