Elasticsearch使用篇 - 管道聚合

本文详细介绍了 Elasticsearch 中的管道聚合,包括 max_bucket、min_bucket、avg_bucket、sum_bucket 等多种聚合类型,以及它们在数据统计和分析中的应用。通过实例展示了如何利用管道聚合进行二次统计,如计算最大值、最小值、平均值和累计值等,为数据处理和分析提供了强大工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

管道聚合

基于前一次聚合的结果,进行二次聚合统计。

从结构上可以分为兄弟级(Sibling)管道聚合和父级(Parent)管道聚合两种方式。

  • 兄弟级管道聚合:在同一聚合级别上可以产生新的聚合。
GET kibana_sample_data_logs/_search
{
   
  "size": 0,
  "aggs": {
   
    "count_per_day": {
   
      "date_histogram": {
   
        "field": "@timestamp",
        "calendar_interval": "day"
      }
    },
    "total_bytes_of_download": {
   
      "sum": {
   
        "field": "bytes"
      }
    }
  }
}
  • 父级管道聚合:由父聚合提供输出,子聚合能够产生新的桶,然后可以添加到父桶中。
GET  kibana_sample_data_logs/_search
{
   
  "size": 0,
  "aggs": {
   
    "count_per_day": {
   
      "date_histogram": {
   
        "field": "@timestamp",
        "calendar_interval": "day"
      },
      "aggs": {
   
        "total_bytes_per_day": {
   
          "sum": {
   
            "field": "bytes"
          }
        }
      }
    }
  }
}

max_bucket、min_bucket、avg_bucket、sum_bucket

基于兄弟级管道聚合的方式,从多个分桶中获取指定数值指标的聚合结果(最大值 / 最小值 / 平均值 / 和)。

  • buckets_path:(必须)目标桶的路径指向。
  • gap_policy:分桶数据出现空值或者缺失值的处理策略,默认 skip。gap_policy 详细说明
    • skip:跳过空值或者缺失值,不参与聚合计算。
    • insert_zeros:将空值或者缺失值当作 0 来参与聚合计算。
    • keep_values:如果提供的指标值是一个空值或者缺失值(null、NAN)则跳过,不参与聚合计算;否则使用该指标值参与聚合计算。
  • format:指定数值的输出格式,比如 #、#0.00。默认 null。

1、统计每个出发地国家的最长的航班飞行时间,并且获取航班飞行时间最长的国家以及对应的航班飞行时间。

GET kibana_sample_data_flights/_search
{
   
  "size": 0,
  "track_total_hits": true,
  "aggs": {
   
    "terms_OriginCountry": {
   
      "terms": {
   
        "field": "OriginCountry",
        "size": 20
      },
      "aggs": {
   
        "max_FlightTimeMin": {
   
          "max": {
   
            "field": "FlightTimeMin"
          }
        }
      }
    },
    "pipeline-max-bucket": {
   
      "max_bucket": {
   
        "buckets_path": "terms_OriginCountry>max_FlightTimeMin"
      }
    }
  }
}

截取部分的聚合结果如下:

"pipeline-max-bucket" : {
   
  "value" : 1902.9019775390625,
  "keys" : [
    "AR"
  ]
}

2、获取出发地国家中各个出发地城市的航班飞行时间的最大值,然后统计出发地城市中航班飞行时间最长的飞行时长以及对应的出发地城市名称。

GET kibana_sample_data_flights/_search
{
   
  "size": 0,
  "track_total_hits": true,
  "aggs": {
   
    "terms_OriginCountry": {
   
      "terms": {
   
        "field": "OriginCountry",
        "size": 20
      },
      "aggs": {
   
        "terms_OriginCityName": {
   
          "terms": {
   
            "field": "OriginCityName",
            "size": 20
          },
          "aggs": {
   
            "max_FlightTimeMin": {
   
              "max": {
   
                "field": "FlightTimeMin"
              }
            }
          }
        },
        "Max_Bucket_OriginCityName_FlightTimeMin": {
   
          "max_bucket": {
   
            "buckets_path": "terms_OriginCityName>max_FlightTimeMin"
          }
        }
      }
    }
  }
}

截取以出发地国家维度的第一个分桶中的管道聚合的结果。

"Max_Bucket_OriginCityName_FlightTimeMin" : {
   
  "value" : 1559.6236572265625,
  "keys" : [
    "Rome"
  ]
}

3、在 2 的基础上获取出发地国家中航班最长的飞行时间以及对应的出发地国家名称。

GET kibana_sample_data_flights/_search
{
   
  "size": 0,
  "track_total_hits": true,
  "aggs": {
   
    "terms_OriginCountry": {
   
      "terms": {
   
        "field": "OriginCountry",
        "size": 20
      },
      "aggs": {
   
        "terms_OriginCityName": {
   
          "terms": {
   
            "field": "OriginCityName",
            "size": 20
          },
          "aggs": {
   
            "max_FlightTimeMin": {
   
              "max": {
   
                "field": "FlightTimeMin"
              }
            }
          }
        },
        "Max_Bucket_OriginCityName_FlightTimeMin": {
   
          "max_bucket": {
   
            "buckets_path": "terms_OriginCityName>max_FlightTimeMin"
          }
        }
      }
    },
    "Max_Bucket_OriginCountry_FlightTimeMin": {
   
      "max_bucket": {
   
        "buckets_path": "terms_OriginCountry>Max_Bucket_OriginCityName_FlightTimeMin"
      }
    }
  }
}

在 2 的基础上额外输出出发地国家纬度的管道聚合结果。

"Max_Bucket_OriginCountry_FlightTimeMin" : {
   
  "value" : 1902.9019775390625,
  "keys" : [
    "AR"
  ]
}

stats_bucket

基于兄弟级管道聚合的方式,从多个分桶中获取指定数值指标的统计聚合结果。

  • buckets_path:(必须)目标桶的路径指向。
  • gap_policy:分桶数据出现空值或者缺失值的处理策略,默认 skip。gap_policy 详细说明
    • skip:跳过空值或者缺失值,不参与聚合计算。
    • insert_zeros:将空值或者缺失值当作 0 来参与聚合计算。
    • keep_values:如果提供的指标值是一个空值或者缺失值(null、NAN)则跳过,不参与聚合计算;否则使用该指标值参与聚合计算。
  • format:指定数值的输出格式,比如 #、#0.00。默认 null。
  • sigma:标准差的倍数,默认 2。用于确定一个数据点是否属于异常值。

1、统计出发地国家中各个出发地城市的航班飞行时间的平均时长,然后统计这些平均时长在出发地国家纬度下的各项指标。

GET kibana_sample_data_flights/_search
{
   
  "size": 0,
  "track_total_hits": true,
  "aggs": {
   
    "terms_OriginCountry": {
   
      "terms": {
   
        "field": "OriginCountry",
        "size": 20
      },
      "aggs": {
   
        "terms_OriginCityName": {
   
          "terms": {
   
            "field": "OriginCityName",
            "size": 20
          },
          "aggs": {
   
            "avg_FlightTimeMin": {
   
              "avg": {
   
                "field": "FlightTimeMin"
              }
            }
          }
        },
        "Stats_Bucket_OriginCityName_FlightTimeMin": {
   
          "stats_bucket": {
   
            "buckets_path": "terms_OriginCityName>avg_FlightTimeMin"
          }
        }
      }
    }
  }
}

截取部分的聚合结果如下:

"Stats_Bucket_OriginCityName_FlightTimeMin" : {
   
  "count" : 15,
  "min" : 226.4979310909907,
  "max" : 472.0975369329038,
  "avg" : 378.1233526619374,
  "sum" : 5671.850289929062
}

extended_stats_bucket

基于兄弟级管道聚合的方式,从多个分桶中获取指定数值指标的拓展统计聚合结果。

  • buckets_path:(必须)目标桶的路径指向。
  • gap_policy:分桶数据出现空值或者缺失值的处理策略,默认 skip。gap_policy 详细说明
    • skip:跳过空值或者缺失值,不参与聚合计算。
    • insert_zeros:将空值或者缺失值当作 0 来参与聚合计算。
    • keep_values:如果提供的指标值是一个空值或者缺失值(null、NAN)则跳过,不参与聚合计算;否则使用该指标值参与聚合计算。
  • format:指定数值的输出格式,比如 #、#0.00。默认 null。
  • sigma:标准差的倍数,默认 2。用于确定一个数据点是否属于异常值。

1、统计出发地国家中各个出发地城市的航班飞行时间的平均时长,然后统计这些平均时长在出发地城市纬度下的各项指标。

GET kibana_sample_data_flights/_search
{
   
  "size": 0,
  "track_total_hits": true,
  "aggs": {
   
    "terms_OriginCountry": {
   
      "terms": {
   
        "field": "OriginCountry",
        "size": 20
      },
      "aggs": {
   
        "terms_OriginCityName": {
   
          "terms": {
   
            "field": "OriginCityName",
            "size": 20
          },
          "aggs": {
   
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值