我是Elasticsearch的新手,我試圖創建一個過濾器來檢索具有特定屬性的文檔。Elasticsearch嵌套對象過濾器
的屬性定義爲嵌套對象的映射,像這樣:
"attributes": {
"type": "nested",
"properties" : {
"id": {
"type": "integer"
},
...
}
}
}
我想要的形式執行復雜查詢:
(attribute.id == 1 OR attribute.id == 2) AND (attribute.id == 3 OR attribute.id == 4)
據我所閱讀到目前爲止我已創建以下查詢以es:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"nested": {
"path": "attributes",
"filter": {
"bool": {
"must": [
{ "bool" : {
"should" : [
{ "term": { "attributes.id": 1 }},
{ "term": { "attributes.id": 2 }}
]
}},
{ "bool" : {
"should" : [
{ "term": { "attributes.id": 3 }},
{ "term": { "attributes.id": 4 }}
]
}}
]
}
}
}
}
}
},
"sort": {
"date": { "order": "desc" }
}
}
但是,這不會返回任何重新sults。如果我刪除must
塊中的兩個bools
中的一個,它會正確過濾文檔。
存在同樣的問題(沒有結果),如果我更改查詢(用於測試目的)到:
"must": [
{ "term": { "attributes.id": 3 }},
{ "bool" : {
"should" : [
{ "term": { "attributes.id": 1 }},
{ "term": { "attributes.id": 2 }}
]
}}
]
這在我的理解轉化爲attributes.id == 3 AND (attributes.id == 1 OR attributes.id == 2)
這是elasticsearch 2.x版本我做錯了什麼?
也許每個'bool'子句可以在它自己的'nested'子句中?而不是將它們全部包裝在一起。 –
@EvaldasBuinauskas我會盡力回覆你。 – mobius
你可以發佈一個你期望被這個查詢返回的示例文檔嗎? – goalie7960