Elasticsearch嵌套排序报错failed to find nested object under path
问题根因
- 你误用了
nested排序语法:ES中nested相关语法仅适用于在mapping中显式定义为nested类型的字段。你当前写入的文档里manager、manager.name都是默认的普通object类型,ES会把这类层级字段打平存储,不存在独立的嵌套对象实体,所以加nested参数时会直接报找不到嵌套路径的错误。 - 排序字段配置错误:你的需求是按姓氏(last name)排序,但原查询里排序字段写的是
manager.name.first(名字字段),和需求不匹配。
修正方案
你当前的文档结构是单层嵌套对象,不是对象数组,完全不需要使用nested类型,直接去掉排序里的nested配置,把排序字段改为实际需要的manager.name.last即可。
注意:如果
manager.name.last是默认的text类型,排序时需要调用其对应的.keyword子字段,否则会按分词结果排序,不符合预期。
修正后的可直接执行的查询语句:
{ "sort": [ { "manager.name.last.keyword": { "order": "desc" } } ], "query": { "match": { "manager.name.first": "John" } } }
补充:什么时候才需要用nested配置?
只有当你需要存储对象数组、且需要保留数组内每个对象的独立属性匹配关系时(比如一个员工对应多个manager的场景),才需要提前在索引mapping里把对应字段显式定义为nested类型,此时nested参数的path必须填写nested类型的最外层路径,不能填内部子字段。
举个nested场景的正确配置示例:
- 首先创建索引时定义nested类型mapping:
PUT your_index_name { "mappings": { "properties": { "region": {"type": "keyword"}, "manager": { "type": "nested", "properties": { "age": {"type": "integer"}, "name": { "properties": { "first": {"type": "text", "fields": {"keyword": {"type": "keyword"}}}, "last": {"type": "text", "fields": {"keyword": {"type": "keyword"}}} } } } } } } }
- 对应查询和排序的写法:
{ "sort": [ { "manager.name.last.keyword": { "order": "desc", "nested": { "path": "manager" } } } ], "query": { "nested": { "path": "manager", "query": { "match": { "manager.name.first": "John" } } } } }
内容的提问来源于stack exchange,提问作者Anonymous Creator
相关产品推荐
相关产品推荐

