2016-02-23 104 views
2

我有一個查詢,當我需要文件 的屬性只匹配一個值時,工作正常。必須匹配多個值

但是我也需要能夠搜索必須與兩個值。

所以,如果一個香蕉有ID 1和一個檸檬有ID 2,我搜索黃色 如果我在must子句中有1和2,我將得到兩者。 但是,如果我只有1我只會得到香蕉。

{ 
    "from": 0, 
    "size": 20, 
    "query": { 
    "bool": { 
    "should": [ 
     { "match": 
     { "fruit.color": "yellow" }} 
    ], 
    "must" : [ 
     { "match": { "fruit.id" : "1" } } 
    ] 
    } 
} 
} 

我還沒有找到一種方法來搜索帶有必須的兩個值。 是可能的嗎?

回答

2

如果文檔「必須」僅在ID爲1或2時才被返回,那聽起來像另一個should子句。如果我正確理解您的問題,則需要id爲1或id 2的文檔。此外,如果顏色爲黃色,請給它更高的分數。

這裏是你可能會達到你要尋找一種方式:

{ 
    "query": { 
    "bool": { 
     "should": { 
     "match": { 
      "fruit.color": "yellow" 
     } 
     }, 
     "must": { 
     "bool": { 
      "should": [ 
      { 
       "match": { 
       "fruit.id": "1" 
       } 
      }, 
      { 
       "match": { 
       "fruit.id": "2" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

這裏我把兩個match查詢一個單獨的布爾查詢should子句。這可以實現您正在查找的OR行爲。

再看看Bool Query documentation並注意should的細微差別。根據是否存在兄弟must子句以及是否在過濾器上下文中執行布爾查詢,它的行爲默認情況下會有所不同。

另一個可調整的關鍵選項,可以幫助您實現預期的結果是minimum_should_match參數。 Have a look at this documentation page

+0

氏似乎這樣的伎倆,謝謝:) – dontberude

+0

@dontberude很高興我能幫忙。 :)如果您有機會,請考慮接受我的答案,以便其他具有類似問題的StackOverflow用戶也可以從中受益。 – BrookeB

2

而不是匹配查詢,您可以簡單地嘗試在多個術語之間查詢OR

匹配查詢通常用於analyzed字段。對於精確匹配,你應該使用term queries

{ 
    "from": 0, 
    "size": 20, 
    "query": { 
    "bool": { 
    "should": [ 
     { "match": 
     { "fruit.color": "yellow" }} 
    ], 
    "must" : [ 
     { "terms": { "fruit.id" : ["1","2"] } } 
    ] 
    } 
} 
}