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

如何在Kibana中实现两个聚合指标的除法运算?

在Kibana中实现聚合指标的除法运算

当然可以实现!你需要的是聚合级别的运算,脚本字段因为是针对单文档计算,所以不适合这个场景,而Pipeline聚合确实是正确的方向,可能之前你没找对配置方式。下面给你两种可行的实现方法:

方法一:使用Elasticsearch Pipeline聚合(Bucket Script)

你的现有请求已经有了两个聚合结果:1(sum_bucket的计数总和)和2(ms.keyword的基数),我们可以添加一个bucket_script类型的Pipeline聚合来完成除法。

修改后的Elasticsearch请求示例

{
  "size": 0,
  "_source": { "excludes": [] },
  "aggs": {
    "1": { "sum_bucket": { "buckets_path": "1-bucket>_count" } },
    "2": { "cardinality": { "field": "ms.keyword" } },
    "1-bucket": { "terms": { "field": "ms.keyword", "size": 10000, "order": { "_count": "desc" } } },
    // 新增的除法聚合
    "division_result": {
      "bucket_script": {
        "buckets_path": {
          "total_count": "1", // 指向第一个聚合的结果
          "unique_ms": "2"    // 指向第二个聚合的结果
        },
        "script": "params.unique_ms == 0 ? 0 : params.total_count / params.unique_ms",
        "lang": "painless"
      }
    }
  },
  "stored_fields": [ "*" ],
  "script_fields": {
    "indiviualCount": {
      "script": {
        "inline": "(doc['campaign'].empty) ? 0 : ((1.0/doc['campaign'].value) * 100)",
        "lang": "painless"
      }
    }
  },
  "docvalue_fields": [ "edrTimestamp", "timestamp" ],
  "query": { "bool": { "must": [ { "match_all": {} } ], "filter": [], "should": [], "must_not": [] } }
}

在Kibana经典可视化中的配置步骤

  1. 打开Kibana的Visualize页面,创建一个新的可视化(比如Metric类型)
  2. 先配置好你的两个基础聚合:
    • 第一个聚合:选择Pipeline > Sum Bucket,设置Buckets Path为你的1-bucket聚合的_count
    • 第二个聚合:选择Metrics > Cardinality,字段选ms.keyword
  3. 添加第三个聚合:选择Pipeline > Bucket Script
  4. 在Buckets Path区域,添加两个参数:
    • 比如命名为total_count,选择第一个聚合的名称
    • 命名为unique_ms,选择第二个聚合的名称
  5. 在Script输入框中写:params.unique_ms == 0 ? 0 : params.total_count / params.unique_ms(处理除数为0的情况,避免报错)
  6. 保存配置后,就能看到除法运算的结果了

方法二:使用Kibana Lens(更直观)

如果你用的是较新版本的Kibana,Lens可视化工具可以直接通过公式实现聚合运算,不需要手动写ES DSL:

  1. 打开Kibana的Lens页面
  2. 添加第一个指标:拖拽ms.keyword到面板,选择Count,然后可以通过聚合设置调整为你需要的sum_bucket逻辑(或者直接用你现有的聚合逻辑)
  3. 添加第二个指标:拖拽ms.keyword到面板,选择Unique count(对应cardinality聚合)
  4. 点击顶部的Add formula按钮,输入公式:
    if($metric2 == 0, 0, $metric1 / $metric2)
    
    这里$metric1是第一个指标的结果,$metric2是第二个指标的结果
  5. 调整可视化类型(比如Metric),就能直接看到除法后的结果

为什么脚本字段不适用?

脚本字段是针对单个文档计算值,每个文档都会生成一个indiviualCount这样的字段,但你需要的是把两个聚合后的整体数值相除,属于聚合层面的运算,所以脚本字段无法满足这个需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:08:10