Elasticsearch如何按子文档内嵌套对象的指定字段对父文档排序
实现方案
这个需求完全可以实现,不需要依赖field_value_factor,借助ES的嵌套对象排序能力+父子文档查询规则即可完成。
前提说明
默认你的索引映射满足以下约定,实际使用时请替换为你自己的字段名:
- 索引通过
join类型字段(示例中命名为relation)定义父子关联,series为父文档类型,episode为子文档类型 episode文档内的publications字段定义为nested嵌套类型
示例查询DSL
以下是查询频道为X、按对应播出记录的startTime倒序排列的series列表的DSL:
GET 你的索引名称/_search { "query": { "bool": { "filter": [ // 仅返回父文档series { "term": { "relation": "series" } }, // 筛选条件:存在至少一个子episode在X频道有播出记录 { "has_child": { "type": "episode", "query": { "nested": { "path": "publications", "query": { "term": { "publications.channel": "X" } } } } } } ] } }, // 核心排序规则 "sort": [ { "episode.publications.startTime": { "order": "desc", // 一个series对应多条播出记录,取最新的时间排序,要最早的话改为min即可 "mode": "max", // 子文档类型路径 "nested_path": "episode", // 过滤出X频道的播出记录参与排序 "nested_filter": { "nested": { "path": "publications", "query": { "term": { "publications.channel": "X" } } } } } } ] }
补充说明
- 如果你没有用父子文档,而是把
episode直接作为series的嵌套字段存储,只需要调整排序规则里的nested_path层级即可,逻辑完全一致 - 用排序规则实现比用
function_score打分的方式性能更好,也更容易维护
内容的提问来源于stack exchange,提问作者siltalau
相关产品推荐
相关产品推荐

