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

如何在Elasticsearch中单次查询计算各key_field对应的volume占比

Elasticsearch 单查询计算分组占比方案

你可以通过 ES 的多聚合组合(分组聚合 + 全局求和聚合 + 管道脚本聚合)实现单次查询计算每个 port 的 volume 占比,不需要多次请求。

以下是完整查询 DSL 示例,假设你的索引名为 traffic,包含字段 port(端口号)、volume(数值字段):

GET /traffic/_search
{
  "size": 0, // 不返回原始文档,仅返回聚合结果
  "aggs": {
    // 全局聚合:统计全量数据的 volume 总和
    "total_all_volume": {
      "sum": {
        "field": "volume"
      }
    },
    // 按 port 字段分组
    "group_by_port": {
      "terms": {
        "field": "port",
        "size": 1000 // 按需调整返回的分组数量,默认仅返回前10个分组
      },
      "aggs": {
        // 统计当前分组的 volume 总和
        "port_total_volume": {
          "sum": {
            "field": "volume"
          }
        },
        // 管道脚本聚合:计算当前分组占总数值的百分比
        "volume_percentage": {
          "bucket_script": {
            "buckets_path": {
              "port_total": "port_total_volume",
              "all_total": "parent>total_all_volume" // 引用上层全局聚合的总数值
            },
            "script": "params.port_total * 100 / params.all_total",
            "format": "0.00" // 可选:百分比保留两位小数
          }
        }
      }
    }
  }
}

结果说明

查询返回的 aggregations.group_by_port.buckets 数组中,每个元素包含3个核心字段:

  • key:对应 port 的取值
  • port_total_volume.value:当前 port 的 volume 总和
  • volume_percentage.value:当前 port 的 volume 占总数值的百分比

对应你给出的示例数据,最终计算结果为:

  • 端口53占比50.00%
  • 端口443占比33.33%
  • 端口80占比16.67%

提示:上述查询使用 ES 原生 Painless 脚本计算,默认权限下即可运行,不需要额外修改脚本配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:48:03