我正在用elasticsearch過濾器掙扎。我有一個company_office
型,看起來像這樣:Elasticsearch查詢幫助 - 多個嵌套與/或
{
"company_office_id": 1,
"is_headquarters": true,
"company": {
"name": "Some Company Inc"
},
"attribute_values": [
{
"attribute_id": 1,
"attribute_value": "attribute 1 value",
},
{
"attribute_id": 2,
"attribute_value": "ABC",
},
{
"attribute_id": 3,
"attribute_value": "DEF",
},
{
"attribute_id": 3,
"attribute_value": "HIJ",
}
]
}
讓我們假設ATTRIBUTE_VALUE是not_analyzed - 這樣我就可以完全匹配就可以了。
現在我想過濾多個attribute_id和值字段的組合。事情是這樣的SQL:
SELECT *
FROM CompanyOffice c
JOIN Attributes a --omitting the ON here, just assume the join is valid
WHERE
c.is_headquarters = true AND
(
(a.attribute_id=2 AND a.attribute_value IN ('ABC')) OR
(a.attribute_id=3 AND a.attribute_value IN ('DEF','HIJ'))
)
所以我需要在特定字段+ ID /值的多種組合進行篩選。
這裏是我試過的查詢:
{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"must" : [
{ "term": {"is_headquarters": true } },
{"bool": {
"must":[
{"term": {"attribute_values.attribute_id": 1}},
{"bool": { "should": [{"term": {"attribute_values.attribute_value": "HIJ"}}]}}
]
}}
]
}
}
}
}
}
該查詢返回的結果,即使在company_office不具有1 /「HIJ」任何ID /值對。在這裏,我的想法是,因爲這個布爾濾波器坐在父must
段裏面,那麼所有項目必須是真實的:
{"bool": {
"must":[
{"term": {"attribute_values.attribute_id": 1}},
{"bool": { "should": [{"term": {"attribute_values.attribute_value": "HIJ"}}]}}
]
}}
爲什麼這個查詢返回的結果給出的問題的開始提供的數據樣本?有沒有不同的方式來編寫過濾器,並完成我想要做的事情?
非常感謝您的幫助!
好棒。我再也不能再嘗試這幾天了,一旦我回來了,我會回來評論答案。謝謝您的幫助!! – MattW
添加嵌套的映射結束了伎倆。再次感謝! – MattW