如何用Elasticsearch按grp分组取最高priority文档并按name排序?
解决方案:通过聚合实现分组取最高优先级文档并按名称排序
要实现每个grp返回优先级最高的文档,同时最终结果按name排序,可以通过聚合组合完成,核心思路是先按grp分组,每组内筛选出优先级最高的文档,再对分组结果按文档名称排序。
完整查询DSL
{ "size": 0, "aggs": { "group_by_grp": { "terms": { "field": "grp", "size": 1000 // 根据实际分组数量调整,确保覆盖所有grp }, "aggs": { "top_priority_doc": { "top_hits": { "size": 1, "sort": [{"priority": "desc"}], "_source": "*" } }, "extract_name": { "max": { "script": "params._source.name" } } } }, "sort_groups_by_name": { "bucket_sort": { "sort": [{"extract_name": "asc"}] } } } }
各部分说明
size: 0:关闭原始结果返回,只获取聚合数据group_by_grp:按grp字段做分组聚合,size需设置为足够大的值,确保包含所有存在的分组top_priority_doc:每个分组内使用top_hits聚合,只取1条按priority降序排序的文档,保证拿到该组优先级最高的记录,_source: "*"指定返回所有字段extract_name:提取每个分组中top文档的name字段(因每组仅1条top文档,max聚合等价于直接取该文档的name)sort_groups_by_name:通过bucket_sort聚合对所有分组按extract_name升序排序,让最终分组结果按name顺序排列
提取结果
查询返回的聚合数据中,遍历aggregations.group_by_grp.buckets,每个bucket下的top_priority_doc.hits.hits[0]就是对应组的目标文档,这些文档已经按name排序完成。
内容的提问来源于stack exchange,提问作者idle
相关产品推荐
相关产品推荐

