• Elasticsearch:Bucket script 聚合


     Bucket script 聚合是一个父管道(parent pipeline)聚合,它执行一个脚本,该脚本可以对父多桶聚合中的指定指标执行每个桶的计算。 指定的指标必须是数字,并且脚本必须返回一个数值。有关 pipeline 聚合的内容,你可以阅读文章 “Elasticsearch:pipeline aggregation 介绍”。

    Bucket script 聚合

    用法

    单独的 bucket_script 聚合看起来像这样:

    1. {
    2. "bucket_script": {
    3. "buckets_path": {
    4. "my_var1": "the_sum",
    5. "my_var2": "the_value_count"
    6. },
    7. "script": "params.my_var1 / params.my_var2"
    8. }
    9. }

    这里,my_var1 是要在脚本中使用的存储桶路径的变量名称,the_sum 是要用于该变量的指标的路径。

    Bucket_script 参数说明
    参数名称描述强制要求默认值
    script为此聚合运行的脚本。 该脚本可以是内联的、文件的或索引的。 (有关详细信息,请参阅脚本必须
    buckets_path脚本变量的映射及其到我们希望用于变量的存储桶的关联路径(有关更多详细信息,请参见 buckets_path 语法)必须
    gap_policy在数据中发现差距时应用的策略(有关详细信息,请参阅处理数据中的差距可选skip
    format输出值的 DecimalFormat 模式。 如果指定,则在聚合的 value_as_string 属性中返回格式化的值可选null

    在以下的展示中,我使用 Elastic Stack 8.4.3 来进行展示。

    示例

    为了说明问题的方便,我们来使用一个示例来进行详细说明。我将使用 Kibana 自带的 eCommerce 索引进行展示。我们的目的是:找出每天销售的 Men's Clothing 这个类别的销售额在总体销售额中的比例

    在本练习中,我们使用 Kibana 自带的一个例子来进行展示:

    这样我能就在 Elasticsearch 中创建了一个叫做 kibana_sample_data_ecommerce 的索引。这个一个 eCommerce 的数据。我们可以在 Discover 中进行查看:

    如上所示,上面的数据展示的是从 10 月 20 号到 10 月 31 号的数据。

    我们可以使用 Lens 来展示每天的文档数:

    如上所示,每天都有一定数量的文档。上面的聚合相当于如下的命令:

    1. GET kibana_sample_data_ecommerce/_search
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "sales_per_day": {
    6. "date_histogram": {
    7. "field": "order_date",
    8. "calendar_interval": "day"
    9. }
    10. }
    11. }
    12. }

     上面的聚合返回如下的数据:

    我们可以通过如下的命令来得到每天的总销售额:

    1. GET kibana_sample_data_ecommerce/_search?filter_path=aggregations
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "sales_per_day": {
    6. "date_histogram": {
    7. "field": "order_date",
    8. "calendar_interval": "day"
    9. },
    10. "aggs": {
    11. "total_sales": {
    12. "sum": {
    13. "field": "products.base_price"
    14. }
    15. }
    16. }
    17. }
    18. }
    19. }

    如上所示,我们求出了每天销售的总额。为了能够求出每天卖出的 Men's clothing 这个类别的总额,我们可以使用另外一个叫做 filter 的聚合: 

    1. GET kibana_sample_data_ecommerce/_search?filter_path=aggregations
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "sales_per_day": {
    6. "date_histogram": {
    7. "field": "order_date",
    8. "calendar_interval": "day"
    9. },
    10. "aggs": {
    11. "total_sales": {
    12. "sum": {
    13. "field": "products.base_price"
    14. }
    15. },
    16. "man's_clothing": {
    17. "filter": {
    18. "term": {
    19. "category.keyword": "Men's Clothing"
    20. }
    21. },
    22. "aggs": {
    23. "sales": {
    24. "sum": {
    25. "field": "products.base_price"
    26. }
    27. }
    28. }
    29. }
    30. }
    31. }
    32. }
    33. }

    如上所示,我们至此求出了 Men's Clothing 这个类别的每天的销售总额。

    我们接下来使用 bucket script 聚合来求出每天的 Men's Clothing 这个类别的总额和当天销售总额的百分比:

    1. GET kibana_sample_data_ecommerce/_search?filter_path=aggregations
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "sales_per_day": {
    6. "date_histogram": {
    7. "field": "order_date",
    8. "calendar_interval": "day"
    9. },
    10. "aggs": {
    11. "total_sales": {
    12. "sum": {
    13. "field": "products.base_price"
    14. }
    15. },
    16. "man's_clothing": {
    17. "filter": {
    18. "term": {
    19. "category.keyword": "Men's Clothing"
    20. }
    21. },
    22. "aggs": {
    23. "sales": {
    24. "sum": {
    25. "field": "products.base_price"
    26. }
    27. }
    28. }
    29. },
    30. "man's_clothing_percentage": {
    31. "bucket_script": {
    32. "buckets_path": {
    33. "mans_clothing": "man's_clothing>sales",
    34. "total_sales": "total_sales"
    35. },
    36. "script": "params.mans_clothing / params.total_sales * 100"
    37. }
    38. }
    39. }
    40. }
    41. }
    42. }

    在上面的 man's_clothing_percentage 聚合中,它使用了其它聚合的结果并算出新的聚合的值。这种聚合被称之为 pipeline 聚合。 特别需要指出的是 man's_clothing>sales 不是布尔比较大小的算式,而是引用聚合值的路径。

    如上所示,我们可以看到每天的 Men's Clothing 的销售额的百分比。

  • 相关阅读:
    软件开发流程
    大一新生HTML期末作业,网页制作作业——海鲜餐饮网站登录页面(单页面)HTML+CSS+JavaScript
    Flink 的 Checkpoint配置详解
    勤于奋快速抖音推书项目
    java练习 day5
    软考 系统架构设计师系列知识点之特定领域软件体系结构DSSA(7)
    HTML实现猜数字游戏
    面部SDF阴影锯齿问题的探索
    PyTorch(四)Torchvision 与 Transforms
    怎么测试服务器访问速度
  • 原文地址:https://blog.csdn.net/UbuntuTouch/article/details/127608883