的我有一個像過濾項其中數組包含任何給定值
{
tags:['a','b','c']
// ... a bunch properties
}
一組文檔正如標題中所述:有沒有辦法來過濾含有任何使用谷給出的標籤的所有文件?
例如,上面記錄將匹配[ 'C', 'd']
或者我應該建立多個 「或」 S手動?
的我有一個像過濾項其中數組包含任何給定值
{
tags:['a','b','c']
// ... a bunch properties
}
一組文檔正如標題中所述:有沒有辦法來過濾含有任何使用谷給出的標籤的所有文件?
例如,上面記錄將匹配[ 'C', 'd']
或者我應該建立多個 「或」 S手動?
編輯:下面的bitset可能是一個有趣的閱讀,但答案本身有點過時。其中一些功能在2.x中發生變化。另外Slawek在另一個答案中指出,在這種情況下,terms
查詢是干擾搜索的簡單方法。最後重構最新的最佳實踐。 -nz
你可能會想一個Bool Query(或更可能Filter旁邊另一個查詢),具有should
條款。
bool查詢有三個主要屬性:must
,should
和must_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
}
}
}
}
還有terms query應該節省一些工作。這裏的示例來自文檔:
{
"terms" : {
"tags" : [ "blue", "pill" ],
"minimum_should_match" : 1
}
}
底下它構造布爾應該。所以它基本上與上面相同,但更短。
還有一個對應的terms filter。
所以總結您的查詢看起來是這樣的:
{
"filtered": {
"query": {
"match": { "title": "hello world" }
},
"filter": {
"terms": {
"tags": ["c", "d"]
}
}
}
}
隨着標籤數量更多,這可能使長度完全不同。
我無法正常工作。你會介意檢查它在這裏http://stackoverflow.com/questions/32252789/elastic-search-rails-combine-multi-match-and-filter –
'minimum_should_match'已被棄用,將失敗。 –
@AinTohvri實際上在elasticsearch 2.0.1中,minimum_should_match仍然有效,官方文檔不會將其標記爲已棄用。 – Sinux
我必須手動構建每個子句,然後... – Olivier
minimum_should_match現在已棄用 –
minimum_should_match不會解決問題,如果您還過濾另一個數組,您需要正常的「或」行爲。 – Innokenty