Elasticsearch 管道聚合

管道聚合


管道聚合处理其他聚合产生的输出,而不是处理文档集,它将信息添加到输出树。存在许多不同类型的管道聚合,这些聚合从其他的聚合中计算不同的信息,这些聚合主要分成两类:

  • 双亲:与双亲聚合输出一起提供的一系列管道聚合,可以用于计算添加到已存在桶的新的桶或聚合。
  • 兄弟:与兄弟聚合输出一起提供的管道聚合,用于计算与兄弟聚合处于相同级别的新聚合。

通过使用buckets_path参数指明所需度量的路径,管道聚合可以引用需要执行计算的聚合。

管道聚合没有子聚合,不过根据类型,它可以引用bucks_path中的其他的管道,从而使管道聚合链化。

因为管道聚合只添加到输出,当链化聚合时,每个管道聚合的输出将会包含在最终输出中。

1 buckets_path 语法

大多数的管道聚合将其他聚合作为输入。输入聚合通过buckets_path参数定义。

AGG_SEPARATOR = ‘>’ ;
METRIC_SEPARATOR = ‘.’ ;
AGG_NAME = ;
METRIC = <the name of the metric (in case of multi-value metrics aggregation)> ;
PATH = <AGG_NAME> [ <AGG_SEPARATOR>, <AGG_NAME> ]* [ <METRIC_SEPARATOR>, ] ;

路径相对于管道聚合所在的位置,这些路径不是绝对路径,并且不能回到聚合树上。

{
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "day"
      },
      "aggs": {
        "the_sum": {
          "sum": {"field": "lemmings"}
        },
        "the_movavg": {
          "moving_avg": {"buckets_path": "the_sum"}
        }
      }
    }
  }
}

note:移动平均数内嵌于日期柱状图之中,引用兄弟度量"the_sum"。
note:buckets_path通过相对路径"the_sum"引用度量。

buckets_path也可以用于兄弟管道聚合,此聚合邻近一系列桶聚合,而不是内嵌于它们。

{
  "aggs": {
    "sales_per_month": {
      "data_histogram": {
        "filed": "date",
        "interval": "month"
      },
      "aggs": {
        "sales": {
          "sum": {
            "field": "price"
          }
        }
      }
    },
    "max_monthly_sales": {
      "max_bucket": {
        "buckets_path": "sales_per_month>sales"
      }
    }
  }
}

note:max_bucket聚合使用buckets_path指定镶嵌在兄弟聚合中的度量。
note:buckets_path指示sales_per_month日期柱状图聚合之中用于获取sales聚合最大值的最大桶聚合。

2 特定路径

除了路径到度量,buckets_path还可以使用特定"_count"路径。这指示管道聚合将文档计数用作输入。

{
  "aggs": {
    "my_date_histo": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "day"
      },
      "aggs": {
        "the_movavg": {
          "moving_avg": {"buckets_path": "_count" }
        }
      }
    }
  }
}

note:可以根据每个桶的文档计数来计算移动平均值,而不使用特定度量。
note:通过使用_count取代度量名称,可以计算树状图中文档计数的移动平均值。

buckets_path还可以使用"_bucket_count"与多桶聚合的路径来使用由管道聚合返回的桶数,而不是使用度量。

{
  "size": 0,
  "aggs": {
    "histo": {
      "date_histogram": {
        "field": "date",
        "interval": "day"
      },
      "aggs": {
        "categories": {
          "terms": {
            "field": "category"
          }
        },
        "min_bucket_selector": {
          "bucket_selector": {
            "buckets_path": {
              "count": "categories._bucket_count"
            },
            "script": {
              "source": "params.count != 0"
            }
          }
        }
      }
    }
  }
}

note:bucket_selector用于筛掉无内部字段值聚合桶的桶。
note:通过使用_bucket_count取代度量名称,可以将不包含categories聚合桶的histo桶过滤掉。

3 处理聚合名称中的点

为了处理名称中带有点的聚合或度量可以使用以下语法:

"buckets_path": "my_percentile[99.9]"
4 处理数据中的缺口

真实世界中的数据常常嘈杂且具有缺口(数据不存在的位置)。
这可能会有多种原因,常见的有:

  • 落入桶中的文档没有包含指定字段
  • 没有文档匹配一个或多个桶的查询
  • 被计算的度量值不能生成值,很可能时因为其他依赖的桶缺失值。一些管道聚合具有需要被满足的特殊需求。(例如,导数不能计算度量的第一个值,因为没有过去的值,HoltWinters移动平均值在开始计算前需要“升温”数据等)

缺口策略用于在缺口或确实数据遭遇时,通知对应管道聚合应做的行为。所有的管道聚合接收gap_policy参数。

当前有两种策略可以选择:

  • skip,此选项以桶不存在缺失数据来对待缺口。它将会跳过桶并且使用下一个可用值进行计算。
  • insert_zeros,此选项会使用零值来替换缺失,管道聚合则会照常计算。

翻译源:Elasticsearch 6.4 文档

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值