如何对Elasticsearch深度嵌套对象的多字段进行过滤查询?
Elasticsearch嵌套数组查询问题解决
需求与问题
需要筛选出至少包含一个同时满足unitWork.name为"home"且job.name为"developper"的unitWorkJobRiskWorkingSituations对象的文档,但当前使用的查询语句无法生效。
目标文档结构
{ "_type": "_doc", "_id": "13", "name": "X", "unitWorkJobRiskWorkingSituations": [ { "unitWork": { "id": 1, "name": "home", "priority": 1 }, "job": { "id": 1, "name": "developper", "priority": 2 } }, { "unitWork": { "id": 2, "name": "home2", "priority": 1 }, "job": { "id": 2, "name": "developer2", "priority": 2 } } ] }
无效的查询语句
{ "query":{ "bool":{ "must":[ { "nested":{ "path":"unitWorkJobRiskWorkingSituations", "query":{ "bool":{ "must":[ { "terms":{ "unitWorkJobRiskWorkingSituations.job.name":["developper"] } }, { "terms":{ "unitWorkJobRiskWorkingSituations.unitWork.name":["home"] } }] } } } }] } } }
问题分析与解决方案
问题根源
- 字段路径冗余:在nested查询内部,已经指定了
path,无需重复写完整的嵌套字段前缀(如unitWorkJobRiskWorkingSituations.job.name),直接使用嵌套对象内的字段名即可。 - 查询类型误用:单个值的精确匹配用
term更合适,terms用于匹配多个值的场景。 - 拼写一致性:需确认需求中的
developer和文档中的developper拼写,保持匹配逻辑的一致性(以下以文档中的developper为准)。
正确查询语句
{ "query": { "bool": { "must": [ { "nested": { "path": "unitWorkJobRiskWorkingSituations", "query": { "bool": { "must": [ { "term": { "unitWork.name": "home" } }, { "term": { "job.name": "developper" } } ] } } } } ] } } }
说明
nested查询确保我们在同一个unitWorkJobRiskWorkingSituations对象内同时匹配两个条件,避免跨对象匹配的问题。- 若需要全文匹配而非精确匹配,可将
term替换为match查询。
内容的提问来源于stack exchange,提问作者famas23
相关产品推荐
相关产品推荐

