返回

剖析管道聚合:Elasticsearch 入门系列指南(六)

后端

Elasticsearch 管道聚合是一个强大的工具,它允许你在聚合结果的基础上进行进一步的计算。这使你能够将复杂的聚合操作分解为更小的、可管理的部分,并创建更精细、更有意义的报告。

管道聚合简介

管道聚合通过应用一系列转换和计算来修改聚合结果。这类似于在 SQL 中使用 SELECT 语句之后应用额外的函数。它允许你根据需要对数据执行更高级别的分析。

管道聚合有两种主要类型:

  • 桶聚合: 用于聚合桶中的文档,例如求和、平均值或最大值。
  • 指标聚合: 用于聚合文档中的特定字段,例如求和、平均值或最小值。

深入了解 buckets_path

buckets_path 是管道聚合中一个重要的参数,它指定要从聚合结果中提取字段的路径。它使用点号分隔符来表示嵌套字段,例如:

buckets_path: "nested_object.field_name"

这将从嵌套对象 nested_object 中提取 field_name 字段。

buckets_path 语法

buckets_path 语法允许使用以下修饰符:

  • <field_name>:要提取的字段名称。
  • <nested_object>.<field_name>:从嵌套对象中提取字段。
  • *:匹配所有字段。
  • ?:可选字段。
  • +:要求字段存在。

示例:buckets_path 的实际应用

考虑以下聚合查询,该查询对 logs 索引中的文档按 level 字段聚合:

{
  "aggs": {
    "logs_by_level": {
      "terms": {
        "field": "level"
      }
    }
  }
}

结果将包含 errorwarninfodebug 级别中的桶。要计算每个级别的日志数,我们可以使用管道聚合:

{
  "aggs": {
    "logs_by_level": {
      "terms": {
        "field": "level"
      },
      "aggs": {
        "total_logs": {
          "bucket_script": {
            "buckets_path": {
              "total_logs": "_count"
            },
            "script": "params.total_logs"
          }
        }
      }
    }
  }
}

此聚合查询使用 buckets_path_count 聚合中提取 total_logs 字段,该聚合计算每个桶中的文档数。结果将包含包含 total_logs 字段的 logs_by_level 聚合桶。

结论

管道聚合是 Elasticsearch 中一个强大的工具,它允许你创建复杂、有意义的报告。通过理解 buckets_path 等重要参数,你可以充分利用此功能,并从你的数据中提取有价值的见解。