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

基于单个字段的Term Aggregation,如何输出多个关联字段?

解决方案

你的需求是按FIELD1分组,同时获取分组计数、FIELD2和FIELD3的值,对应SQL的SELECT COUNT(FIELD1), FIELD2, FIELD3 FROM TABLE GROUP BY FIELD1。当前方案的问题及优化方式如下:

问题分析

  1. top_hits默认仅返回1条数据:top_hits聚合默认size=1,只会返回分组内第一条文档的FIELD2/3值,若分组内存在多个不同的FIELD2/3值,会遗漏其他结果。
  2. 聚合命名重复:父聚合和子聚合均使用agg_name,虽不影响功能,但可读性差,建议区分命名。
  3. 未设置查询size=0:若未指定size:0,查询会返回部分原始文档,可能干扰聚合结果的查看。

优化方案

根据业务场景选择对应方案:

场景1:同一FIELD1分组内的FIELD2、FIELD3为唯一值

如果每个FIELD1对应的FIELD2、FIELD3固定不变(比如FIELD1是用户ID,FIELD2是用户名,FIELD3是用户邮箱),用min/max聚合直接获取字段值,性能比top_hits更优:

{
  "size": 0,
  "aggs": {
    "group_by_field1": {
      "terms": {
        "field": "FIELD1",
        "order": { "_count": "desc" }
      },
      "aggs": {
        "field2": { "min": { "field": "FIELD2" } },
        "field3": { "min": { "field": "FIELD3" } }
      }
    }
  }
}

返回结果中,每个bucket的doc_count就是分组的计数(对应SQL的COUNT(FIELD1)),field2和field3为对应字段的唯一值。

场景2:同一FIELD1分组内的FIELD2、FIELD3存在多个不同值

若需要保留分组内所有FIELD2/3的组合,调整top_hits的size参数至足够覆盖分组内的文档数量,同时区分聚合命名:

{
  "size": 0,
  "aggs": {
    "group_by_field1": {
      "terms": {
        "field": "FIELD1",
        "order": { "_count": "desc" }
      },
      "aggs": {
        "related_docs": {
          "top_hits": {
            "size": 100, // 根据实际分组内文档数调整
            "_source": {
              "includes": ["FIELD2", "FIELD3"]
            }
          }
        }
      }
    }
  }
}

返回结果中,每个bucket的doc_count是分组计数,related_docs.hits.hits会包含分组内指定数量文档的FIELD2/3值。

内容的提问来源于stack exchange,提问作者Bindu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:05:36