Elasticsearch-Pipeline Aggregation

  • 管道概念:支持对聚合分析的结果进行再次聚合分词

  • Pipeline的分析结果会输出到原结果中,根据位置的不同,分为两类

    • Sibling --结果和现有分析结果同级

      • mac,min,avg & sum Bucket

      • Stats,Extended Status Bucket

      • Percentiles Bucket

POST /employees/_search
{
  "size":0,
  "aggs": {
    "jobs": {
      "terms": {
        "field": "job.keyword",
        "size": 10
      },
      "aggs": {
        "avg_salary": {
          "avg": {
            "field": "salary"
          }
        }
      }
    },
    "min_salary_job":{
      "min_bucket": {
        "buckets_path": "jobs>avg_salary"
      }
    }
  }
}

POST /employees/_search
{
  "size":0,
  "aggs": {
    "jobs": {
      "terms": {
        "field": "job.keyword",
        "size": 10
      },
      "aggs": {
        "avg_salary": {
          "avg": {
            "field": "salary"
          }
        }
      }
    },
    "min_salary_job":{
      "max_bucket": {
        "buckets_path": "jobs>avg_salary"
      }
    }
  }
}

POST /employees/_search
{
  "size":0,
  "aggs": {
    "jobs": {
      "terms": {
        "field": "job.keyword",
        "size": 10
      },
      "aggs": {
        "avg_salary": {
          "avg": {
            "field": "salary"
          }
        }
      }
    },
    "min_salary_job":{
      "avg_bucket": {
        "buckets_path": "jobs>avg_salary"
      }
    }
  }
}

POST /employees/_search
{
  "size":0,
  "aggs": {
    "jobs": {
      "terms": {
        "field": "job.keyword",
        "size": 10
      },
      "aggs": {
        "avg_salary": {
          "avg": {
            "field": "salary"
          }
        }
      }
    },
    "min_salary_job":{
      "stats_bucket": {
        "buckets_path": "jobs>avg_salary"
      }
    }
  }
}


POST /employees/_search
{
  "size":0,
  "aggs": {
    "jobs": {
      "terms": {
        "field": "job.keyword",
        "size": 10
      },
      "aggs": {
        "avg_salary": {
          "avg": {
            "field": "salary"
          }
        }
      }
    },
    "min_salary_job":{
      "percentiles_bucket": {
        "buckets_path": "jobs>avg_salary"
      }
    }
  }
}

  • Parent --结果内嵌到现有的聚合分析结果之中(对分桶内部进行聚合)

    • Derivative (求导)

    • Cumultive Sum (累计求和)

    • Moving Function (滑动窗口)

    • moving_avg

    • bucket_script:会对每个桶执行一段脚本, 运算结果会添加到父聚集的结果中

    • bucket_selector:执行一段脚本,但它执行的结果一定是布尔类型, 并且决定当前桶是否出现在父聚集的结果中

    • bucket_sort:根据每桶中的具体指标值决定桶的次序

    • serial_diff

 按照年龄对平均工资求导
POST /employees/_search
{
  "aggs": {
    "age": {
      "histogram": {
        "field": "age",
        "interval": 1
      },
      "aggs": {
        "avg_salary": {
          "avg": {
            "field": "salary"
          }
        },
        "derivative_age_salary":{
          "derivative": {
            "buckets_path": "avg_salary"
          }
        }
      }
    }
  }
}

对平均工资进行累计求和

POST /employees/_search
{
  "aggs": {
    "age": {
      "histogram": {
        "field": "age",
        "interval": 1
      },
      "aggs": {
        "avg_salary": {
          "avg": {
            "field": "salary"
          }
        },
        "derivative_age_salary":{
          "cumulative_sum": {
            "buckets_path": "avg_salary"
          }
          
        }
      }
    }
  }

 moving_fn

  • 由于使用滑动窗口运算时每次移动1个位置,这就要求moving_fn所在聚集桶与桶间隔必须固定,所以这两种管道聚集只能在histogam和date_histogam聚集中使用
  • moving_fn管道聚集则可以对落在窗口内的父聚集结果做各种自定义的运算

 POST /employees/_search
{
  "aggs": {
    "age": {
      "histogram": {
        "field": "age",
        "interval": 1
      },
      "aggs": {
        "avg_salary": {
          "avg": {
            "field": "salary"
          }
        },
        "moving_avg_salary":{
          "moving_fn": {
            "buckets_path": "avg_salary",
            "window": 10,
            "script":"MovingFunctions.min(values)"
          }
        }
      }
    }
  }
}

  • 在示例中,最外层的父聚集day_price是1个date_histogam桶型聚集,它根据文档的timestamp字段按天将文档分桶。day_price聚集包含avg_price和smooth_price两个子聚集,其中avg_price聚集是一个求AvgTicketPrice字段在1个桶内平均值的avg聚集,而smooth_price则是一个使用滑动窗口做平均值平滑的管道聚集,窗口宽度由参数window设置为10,默认值为5。

    通过返回结果比较avg_price与smooth_price就会发现,后者由于经过了滑动窗口运算,数据变化要平滑得多。moving_fn聚集包含一个用于指定运算脚本的script参数,在脚本中可以通过values访问buckets_path参数指定的指标值。moving_fn还内置了一个MovingFunctions类,包括多个运算函数:

    • max()
    • min( )
    • sum( )
    • stdDev( ) 标准偏差
    • unweightedAvg( ) 无加权平均值
    • linearWeightedAvg( ) 线性加权移动平均值
    • ewma( ) 指数加权移动平均值
    • holt( ) 二次指数加权移动平均值
    • holtWinters( ) 三次指数加权移动平均值

 bucket_script、bucket_selector、bucket_sort

POST /kibana_sample_data_flights/_search?filter_path=aggregations

{

  "aggs": {

    "date_price_diff": {

      "date_histogram": {

        "field": "timestamp",

        "fixed_interval": "1d"

      },

      "aggs": {

        "stat_price_day": {

          "stats": {

            "field": "AvgTicketPrice"

          }

        },

        "diff": {

          "bucket_script": {

            "buckets_path": {

              "max_price": "stat_price_day.max",

              "min_price": "stat_price_day.min"

            },

            "script": "params.max_price - params.min_price"

          }

        },

        "gt990": {

          "bucket_selector": {

            "buckets_path": {

              "max_price": "stat_price_day.max",

              "min_price": "stat_price_day.min"

            },

            "script": "params.max_price - params.min_price > 990"

          }

        },

        "sort_by": {

          "bucket_sort": {

            "sort": [

              {

                "diff": {

                  "order": "desc"

                }

              }

            ]

          }

        }

      }

    }

  }

}

 

  • diff是一个 bucket_script管道聚集,它的作用是向最终聚集结果中添加 代表最大值与最小值之差的diff字段。它通过buckets_path定义了两个参数max_price和min_price,并在script参数中通过脚本计算了这两个值的差作为最终结果,而这个结果将出现在整个聚集结果中 
  • gt990是一个bucket_selector管道聚集,它的作用是筛选哪些桶可以出现在最终的聚集结果中。它也在buckets_path中定义了相同的参数,不同的是它的script参数运算的不是差值,而是差值是否大于990,即“ params.max_price - params.min_price > 990 "。如果差值大于990即运算结果为true,那么当前桶将被选取到结果中,否则当前桶将不能在结果中出现
  • sort_by是一个bucket_sort管道聚集,它的作用是给最终的聚集结果排序。它通过sort参数接收一组排序对象,在示例中是使用diff聚集的结果按倒序排序。所以示例整体的运算效果就是将那些票价最大值与最小值大于990的桶选取出来,并在桶中添加diff字段保存最大值与最小值的差值,并按diff字段值降序排列。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部