Pipeline aggregations 作用于其他聚合的结果而不是文档集,用于向响应信息添加追加信息。Pipeline aggregations 有很多种,每种都可以从其他聚合得到不同的信息,我们可以近似把它们分为2大类:
类型 | 说明 |
---|---|
Parent | 在父聚合的结果上进行聚合计算并且可以计算出新的分组或是新的聚合结果加入到现有分组中。 |
Sibling | 在兄弟聚合(同级聚合)的结果上进行聚合计算。计算出一个新的聚合结果,结果与兄弟聚合的结果同级。 |
buckets_path
参数的路径值可以用来指出指标计算基于的聚合,定义这些路径的语法可以在下面的buckets_path
语法部分中找到。
Pipeline aggregations不可以有子聚合但是可以用buckets_path
引入其他的Pipeline aggregations从而将Pipeline aggregations链接起来,例如:你可以把两个导数连接起来计算二阶导数(即导数的导数)。
注意:
由于pipeline aggregations只会追加输出结果, 当链接pipeline aggregations的时候,每个pipeline aggregations的结果都会包含在最终的响应结果里面。
大多数的 pipeline aggregations需要其他的聚合作为它们的输入源,作输入源的聚合可以通过buckets_path
参数指明,要求格式如下:
AGG_SEPARATOR = '>' ;
METRIC_SEPARATOR = '.' ;
AGG_NAME = <the name of the aggregation> ;
METRIC = <the name of the metric (in case of multi-value metrics aggregation)> ;
PATH = <AGG_NAME> [ <AGG_SEPARATOR>, <AGG_NAME> ]* [ <METRIC_SEPARATOR>, <METRIC> ] ;
例如,路径 my_bucket>my_stats.avg
表明需要对my_bucket
分组聚合的my_stats
平均值指标作为pipeline aggregations的输入源。
pipeline aggregation和路径是相关联的; 并不是绝对路径,路径也不可以顺着聚合路径向上,例如,在日期直方图聚合中嵌入移动平均值聚合, 同级聚合the_sum
指标:
POST /_search
{
"aggs": {
"my_date_histo":{
"date_histogram":{
"field":"timestamp",
"interval":"day"
},
"aggs":{
"the_sum":{ #指标
"sum":{ "field": "lemmings" }
},
"the_movavg":{
"moving_avg":{ "buckets_path": "the_sum" } #指明相对路径指标
}
}
}
}
}
buckets_path
也可以在同级 pipeline aggregations中使用, pipeline aggregations的结果会和分组聚合的分组同级而不是嵌入它们,例如 max_bucket
聚合使用buckets_path
指定一个嵌入同级聚合的指标。
POST /_search
{
"aggs" : {
"sales_per_month" : {
"date_histogram" : {
"field" : "date",
"interval" : "month"
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
}
}
},
"max_monthly_sales": {
"max_bucket": {
"buckets_path": "sales_per_month>sales" #我们希望得到同级日期直方图分组聚合内部的sales总数指标聚合值的最大聚合指标
}
}
}
}
除了指明指标路径,buckets_path
也可以使用特殊的 _count"
参数路径.让 pipeline aggregation用文档的计数作为输入源. 例如, 分组聚合每个分组的移动平均值可以不用给出具体路径
POST /_search
{
"aggs": {
"my_date_histo": {
"date_histogram": {
"field":"timestamp",
"interval":"day"
},
"aggs": {
"the_movavg": {
"moving_avg": { "buckets_path": "_count" } # 使用 _count 而不是指标名称,我们就可以计算日期直方图聚合分组文档的移动平均值
}
}
}
}
}
buckets_path
也可以使用_bucket_count
来表明使用多分组聚合的分组数而不是具体指标。 例如 bucket_selector
可以用来指出内部索引词聚合没有分组的分组 。
POST /sales/_search
{
"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"
}
}
}
}
}
}
}
使用_bucket_count
而不是指标名称我们可以指出内部categories聚合没有分组的分组 。
处理聚集在名称中有点的聚合或指标支持另一种语法,例如:99.9%指标可以表示为:
"buckets_path": "my_percentile[99.9]"
现实中的数据不总是我们希望的,具有空值——指定域不存在的数据是时常存在的,最常见的原因如下:
Gap policies
是用来通知pipeline aggregation当遇到有缺失数据时的处理策略。 所有的 pipeline aggregations 都可以配置 gap_policy
参数,它们有2种可供选择:
方案 | 说明 |
---|---|
skip | 如果计算时遇到具有空值的数据则跳过,继续执行下一个数据。 |
insert_zeros | 当遇到空值,则将空值替换成0,然后继续执行 |