You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:01:24