Elasticsearch 6.8如何实现外层按popular降序、嵌套sales.price升序排序
Elasticsearch 6.8 嵌套数组内部排序实现方案
问题原因
你之前配置的popular降序+sales.price升序的排序规则不生效,是因为ES默认的查询排序参数仅作用于外层文档的返回顺序,无法修改单个文档内部嵌套数组的元素排列顺序。额外添加的sales.price升序规则实际作用为:当多个外层文档的popular值相等时,按sales数组中price的最小值排序外层文档的先后,和你的预期需求不符。
实现方案
Elasticsearch 6.8完全支持该需求,推荐使用脚本字段的方式实现,无需修改索引映射,适配性更强,示例DSL如下:
GET /<你的索引名称>/_search { "query": { "match_all": {} // 替换为你实际使用的查询条件 }, "sort": [ { "popular": { "order": "desc" } } ], "_source": ["popular"], // 仅返回原始的popular字段,过滤原始未排序的sales字段 "script_fields": { "sales": { "script": { "lang": "painless", "source": """ // 对原始sales数组按price字段升序排序 def sorted = params._source.sales.stream() .sorted((a,b) -> a.price.compareTo(b.price)) .collect(Collectors.toList()); return sorted; """ } } } }
方案说明
- 外层排序规则保留
popular降序,符合你对文档返回顺序的要求 - 脚本字段会读取每个文档的原始
sales数组,按price字段升序排序后返回,直接得到你预期的结构 - 该方案对
sales字段的映射类型无要求,普通object类型和nested类型都可使用
注意事项
如果你的sales字段存储了除price外的其他属性,上述脚本会保留所有属性值,仅调整元素顺序,无需额外修改逻辑。
内容的提问来源于stack exchange,提问作者user2245564
相关产品推荐
相关产品推荐

