2015-01-17 65 views
33

的我有一個像過濾項其中數組包含任何給定值

{ 
    tags:['a','b','c'] 
    // ... a bunch properties 
} 

一組文檔正如標題中所述:有沒有辦法來過濾含有任何使用谷給出的標籤的所有文件?

例如,上面記錄將匹配[ 'C', 'd']

或者我應該建立多個 「或」 S手動?

回答

25

編輯:下面的bitset可能是一個有趣的閱讀,但答案本身有點過時。其中一些功能在2.x中發生變化。另外Slawek在另一個答案中指出,在這種情況下,terms查詢是干擾搜索的簡單方法。最後重構最新的最佳實踐。 -nz

你可能會想一個Bool Query(或更可能Filter旁邊另一個查詢),具有should條款。

bool查詢有三個主要屬性:must,shouldmust_not。其中每個接受另一個查詢或一系列查詢。這些子句的名稱是不言自明的;在你的情況下,should子句可以指定一個列表過濾器,與其中任何一個的匹配都會返回你正在查找的文檔。

從文檔:

在布爾查詢沒有must條款,一個或多個should條款必須的文件相匹配。可以使用參數minimum_should_match來設置要匹配的最小條件數。

這裏是什麼布爾查詢可能看起來像孤立的例子:

{ 
    "bool": { 
    "should": [ 
     { "term": { "tag": "c" }}, 
     { "term": { "tag": "d" }} 
    ] 
    } 
} 

這裏還有一個更通用Filtered Query內的布爾查詢作爲過濾器的另一個例子:

{ 
    "filtered": { 
    "query": { 
     "match": { "title": "hello world" } 
    }, 
    "filter": { 
     "bool": { 
     "should": [ 
      { "term": { "tag": "c" }}, 
      { "term": { "tag": "d" }} 
     ] 
     } 
    } 
    } 
} 

無論您使用Bool作爲查詢(例如,以影響匹配的分數),還是作爲過濾器(例如,減少被評分或後過濾的命中)都是主觀的,取決於您的r equirements。

除非您有理由使用And/Or/Not(這樣的理由確實存在),否則通常最好使用Bool來支持Or Filter。 Elasticsearch博客提供了更多關於每個實現的不同實現的信息,以及什麼時候您可能更喜歡Bool over和/或/ Not,反之亦然。

Elasticsearch博客:All About Elasticsearch Filter Bitsets

更新與重構查詢...

現在,所有的出的方式,terms查詢是所有的機版本以上。它對於引擎蓋下的查詢類型做了正確的事情,它的行爲與使用minimum_should_match選項的bool + should的行爲相同,總體上更簡潔一些。

下面是最後一個查詢重構了一下:

{ 
    "filtered": { 
    "query": { 
     "match": { "title": "hello world" } 
    }, 
    "filter": { 
     "terms": { 
     "tag": [ "c", "d" ], 
     "minimum_should_match": 1 
     } 
    } 
    } 
} 
+0

我必須手動構建每個子句,然後... – Olivier

+2

minimum_should_match現在已棄用 –

+0

minimum_should_match不會解決問題,如果您還過濾另一個數組,您需要正常的「或」行爲。 – Innokenty

35

還有terms query應該節省一些工作。這裏的示例來自文檔:

{ 
    "terms" : { 
     "tags" : [ "blue", "pill" ], 
     "minimum_should_match" : 1 
    } 
} 

底下它構造布爾應該。所以它基本上與上面相同,但更短。

還有一個對應的terms filter

所以總結您的查詢看起來是這樣的:

{ 
    "filtered": { 
    "query": { 
     "match": { "title": "hello world" } 
    }, 
    "filter": { 
     "terms": { 
     "tags": ["c", "d"] 
     } 
    } 
    } 
} 

隨着標籤數量更多,這可能使長度完全不同。

+1

我無法正常工作。你會介意檢查它在這裏http://stackoverflow.com/questions/32252789/elastic-search-rails-combine-multi-match-and-filter –

+5

'minimum_should_match'已被棄用,將失敗。 –

+0

@AinTohvri實際上在elasticsearch 2.0.1中,minimum_should_match仍然有效,官方文檔不會將其標記爲已棄用。 – Sinux

相關問題