ElasticSearch学习笔记之二十七 Pipeline Aggregations

ElasticSearch学习笔记之二十七 Pipeline Aggregations

  • Pipeline Aggregations
    • buckets_path 语法
    • Special Paths(特殊路径)
    • Dealing with dots in agg names(处理聚合名称中有.)
    • Dealing with gaps in the data(处理空数据)

Pipeline Aggregations

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的结果都会包含在最终的响应结果里面。

buckets_path 语法

大多数的 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总数指标聚合值的最大聚合指标
            }
        }
    }
}

Special Paths(特殊路径)

除了指明指标路径,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聚合没有分组的分组 。

Dealing with dots in agg names(处理聚合名称中有.)

处理聚集在名称中有点的聚合或指标支持另一种语法,例如:99.9%指标可以表示为:

"buckets_path": "my_percentile[99.9]"

Dealing with gaps in the data(处理空数据)

现实中的数据不总是我们希望的,具有空值——指定域不存在的数据是时常存在的,最常见的原因如下:

  • 文档分到一个不包含需要的字段的分组。
  • 一个或者多个分组没有匹配文档
  • 很可能因为一个依赖的分组缺少值导致无法计算指标值。一些pipeline aggregations具有必须满足的特定要求。(例如,由于没有先前的值,导数不能计算第一个值的。

Gap policies 是用来通知pipeline aggregation当遇到有缺失数据时的处理策略。 所有的 pipeline aggregations 都可以配置 gap_policy 参数,它们有2种可供选择:

方案 说明
skip 如果计算时遇到具有空值的数据则跳过,继续执行下一个数据。
insert_zeros 当遇到空值,则将空值替换成0,然后继续执行

你可能感兴趣的:(ElasticSearch学习笔记之二十七 Pipeline Aggregations)