管道聚合

📖 概念与教程请阅读 管道聚合教程

管道聚合 - API 参考 #

本节详细列出所有管道聚合的参数与用法。

相关资源 #


管道聚合类型 #

管道聚合分为父级聚合(在每个桶内计算)和同级聚合(跨所有桶计算)两类。

父级管道聚合 (8 种) #

父级聚合单独处理每个桶,并将结果写回到每个桶中:

聚合说明常见用途
derivative计算一阶/二阶导数(变化率)趋势分析、增长率计算
cumulative_sum计算累积和累积总额、运行总计
moving_avg计算移动平均值趋势平滑、噪声消除
moving_function在滑动窗口上执行自定义脚本自定义移动计算
serial_diff计算当前桶与前一个桶的差值同比对比、季节性分析
bucket_script使用脚本对多个指标进行计算自定义指标、复杂计算
bucket_selector根据条件过滤桶结果过滤、异常检测
bucket_sort对桶进行排序或截断排序、分页、TopK 结果

同级管道聚合 (7 种) #

同级聚合跨所有桶计算,生成单个输出值:

聚合说明常见用途
avg_bucket计算所有桶的指标平均值平均桶指标、汇总分析
sum_bucket计算所有桶的指标总和总计、聚合求和
min_bucket找出所有桶中的最小值最小值检测
max_bucket找出所有桶中的最大值最大值检测、峰值分析
stats_bucket返回所有桶的统计信息统计分析
extended_stats_bucket返回扩展统计信息(含标准差等)扩展统计、方差分析
percentiles_bucket计算所有桶的百分位数百分位分析、分布统计

buckets_path 语法 #

管道聚合使用 buckets_path 参数引用其他聚合的输出:

buckets_path = <agg_name>[ > <agg_name> ... ][ .<metric_name> ]
元素说明
<agg_name>要引用的聚合名称
>子选择器,导航到嵌套聚合
.<metric_name>从多值聚合中选择特定指标

示例 #

{
  "aggs": {
    "sales_per_month": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_sales": {
          "sum": { "field": "price" }
        },
        "sales_deriv": {
          "derivative": {
            "buckets_path": "total_sales"
          }
        }
      }
    }
  }
}

注意事项 #

  1. 管道聚合在所有其他同级聚合之后执行
  2. 管道聚合不能包含子聚合,但可以链接其他管道聚合
  3. 建议将 min_doc_count 设置为 0,避免空桶被跳过导致计算错误

buckets_path 进阶 #

要引用嵌在 parent_agg 中的 child_agg 的平均价格,请使用 parent_agg>child_agg.avg

参考样例:

  • my_sum.sum:引用 my_sum 聚合中的总和指标
  • popular_tags>my_sum.sum:引用嵌在 popular_tags 聚合下的 my_sum 聚合中的 sum 指标

对于多值指标聚合(如 statspercentiles),必须在路径中包含指标名称(例如 .min)。对于单值指标(如 sumavg),如果无歧义可以省略指标名称。

分组路径示例 #

以下示例基于日志样本数据。它在 bytes 字段的值上创建直方图,在每个直方图分组中求和 phpmemory 字段值,并最终使用 sum_bucket 管道聚合求和这些分组。 buckets_path 遵循 number_of_bytes>sum_total_memory 路径从 number_of_bytes 父聚合到 sum_total_memory 子聚合:

GET sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "number_of_bytes": {
      "histogram": {
        "field": "bytes",
        "interval": 10000
      },
      "aggs": {
        "sum_total_memory": {
          "sum": {
            "field": "phpmemory"
          }
        }
      }
    },
    "sum_copies": {
      "sum_bucket": {
        "buckets_path": "number_of_bytes>sum_total_memory"
      }
    }
  }
}

请注意, buckets_path 包含组件聚合的名称。路径是定向的,意味着它们单向传递,从父聚合到子聚合。

管道聚合返回所有分组汇总的总内存:

{
  ...
  "aggregations": {
    "number_of_bytes": {
      "buckets": [
        {
          "key": 0,
          "doc_count": 13372,
          "sum_total_memory": {
            "value": 91266400
          }
        },
        {
          "key": 10000,
          "doc_count": 702,
          "sum_total_memory": {
            "value": 0
          }
        }
      ]
    },
    "sum_copies": {
      "value": 91266400
    }
  }
}

统计路径 #

你可以将 buckets_path 指向一个计数而非值作为其输入。为此,请使用 _count 分组路径变量。

以下示例计算来自日志样本数据的字节数的直方图的基本统计信息。它在 bytes 字段的值上创建一个直方图,然后在直方图分组中的计数上计算统计信息。

GET sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "number_of_bytes": {
      "histogram": {
        "field": "bytes",
        "interval": 10000
      }
    },
    "count_stats": {
      "stats_bucket": {
        "buckets_path": "number_of_bytes>_count"
      }
    }
  }
}

结果显示每个分组的文档计数统计信息:

{
...
  "aggregations": {
    "number_of_bytes": {
      "buckets": [
        {
          "key": 0,
          "doc_count": 13372
        },
        {
          "key": 10000,
          "doc_count": 702
        }
      ]
    },
    "count_stats": {
      "count": 2,
      "min": 702,
      "max": 13372,
      "avg": 7037,
      "sum": 14074
    }
  }
}

数据缺口 #

实际使用中,可以使用嵌套聚合对多个原因进行聚合,原因包括:

  • 数值中的缺失值。
  • 聚合链中的空分组。
  • 计算分组数所需的缺失数值(例如,,某些分组号需要一个或多个前置值才能计算)。

您可以使用 gap_policy 属性指定处理缺失数据的策略:跳过缺失数据或将缺失数据替换为零。

gap_policy 参数适用于所有管道聚合。

参数必选/可选数据类型描述
gap_policy可选string缺失数据的应用策略。有效值为 skip 和 insert_zeros 。默认值为 skip 。
format可选string一个 DecimalFormat 格式化字符串。返回格式化后的输出到聚合的 value_as_string 属性中。