Elasticsearch多层嵌套查询报错,求正确编写方法
解决Elasticsearch嵌套查询的解析错误问题
你的报错是因为嵌套查询的结构写错了——第二个nested查询直接和外层的bool平级了,这不符合Elasticsearch的查询语法规则,导致解析器无法正确识别结构。
要实现你需要的查询逻辑(找到拥有符合条件的Car,且该Car包含指定Radio的Person),正确的做法是把针对radios的嵌套查询放到第一个bool.filter的数组里,作为和Car的ID、年份条件并列的过滤条件。这样Elasticsearch就能理解:我们要找的是同时满足Car的ID为X、年份在40-100之间,并且该Car下存在ID为Y的Radio的Person。
下面是修正后的查询语句:
{ "query": { "nested": { "path": "person.cars", "query": { "bool": { "filter": [ { "match": { "person.cars.id": { "query": "X" } } }, { "range": { "person.cars.year": { "from": 40, "to": 100 } } }, { "nested": { "path": "person.cars.radios", "query": { "bool": { "filter": [ { "match": { "person.cars.radios.id": { "query": "Y" } } } ] } } } } ] } } } } }
简单解释下结构逻辑:
- 最外层的
nested指定我们要操作person.cars这个嵌套字段 - 内部的
bool.filter用来组合所有必须满足的条件:- 匹配Car的ID为X
- 匹配Car的年份在40到100之间
- 嵌套查询
person.cars.radios,匹配该Car下存在ID为Y的Radio
这样所有条件都会针对同一个Car文档生效,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Adrian Klimczak
相关产品推荐
相关产品推荐

