我正在用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