Nested 嵌套聚合

示例场景:分析每个订单中不同产品的平均价格。
假设数据:一个订单可以有多个产品,每个产品都有一个价格。
查询语句:

POST /orders/_search
{
  "size": 0,
  "aggs": {
    "orders": {
      "nested": {
        "path": "products"
      },
      "aggs": {
        "avg_price_per_order": {
          "avg": {
            "field": "products.price"
          }
        }
      }
    }
  }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
class="hide-preCode-box">
Pipeline 管道聚合

示例场景:在按月份统计的销售记录中找出销售额最高的月份,并计算该月的平均销售额。
查询语句:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "sale_date",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "amount"
          }
        },
        "top_sales_month": {
          "top_hits": {
            "sort": [
              { "total_sales": { "order": "desc" } }
            ],
            "size": 1
          }
        },
        "avg_sales_top_month": {
          "avg_bucket": {
            "buckets_path": "total_sales"
          }
        }
      }
    }
  }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">
Derivative(导数聚合)

示例场景:分析销售数据的变化趋势,计算销售额的日增长率。
查询语句:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "sale_date",
        "calendar_interval": "day"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "amount"
          }
        },
        "sales_derivative": {
          "derivative": {
            "buckets_path": "total_sales"
          }
        }
      }
    }
  }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

我们首先按天对销售数据进行分组,并计算每天的总销售额。然后,我们使用derivative管道聚合来计算销售额的日增长率。

Cumulative Sum(累计和聚合)

示例场景:计算销售数据的累计和,展示销售额的累计增长情况。
查询语句:

POST  /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "sale_date",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "amount"
          }
        },
        "cumulative_sales": {
          "cumulative_sum": {
            "buckets_path": "total_sales"
          }
        }
      }
    }
  }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

我们按月对销售数据进行分组,并计算每月的总销售额。然后,我们使用cumulative_sum管道聚合来计算销售额的累计和。

Moving Average(移动平均聚合)

示例场景:分析销售数据的移动平均线,以平滑数据波动并识别趋势。
查询语句:

POST /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "sale_date",
        "calendar_interval": "day"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "amount"
          }
        },
        "moving_avg_sales": {
          "moving_avg": {
            "buckets_path": "total_sales",
            "window": 7  // 计算7天的移动平均
          }
        }
      }
    }
  }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

我们按天对销售数据进行分组,并计算每天的总销售额。然后,我们使用moving_avg管道聚合来计算7天的移动平均销售额。

Bucket Script(桶脚本聚合)

示例场景:计算每个销售桶中不同产品的销售额占比。
查询语句(假设每个销售桶中按产品分组):

POST  /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_by_product": {
      "terms": {
        "field": "product.keyword"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "amount"
          }
        },
        "sales_percentage": {
          "bucket_script": {
            "buckets_path": {
              "thisSales": "total_sales",
              "totalSales": "_sum"  // 假设外层还有一个求和聚合来计算总销售额
            },
            "script": "params.thisSales / params.totalSales * 100"
          }
        }
      }
    },
    "total_sales": {
      "sum": {
        "field": "amount"
      }
    }
  }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

bucket_script引用了两个buckets_path,其中_sum是Elasticsearch中的一个特殊变量,它引用了当前聚合上下文中所有桶的总和。这个示例假设外层还有一个求和聚合来计算所有产品的销售总额。然后,我们计算每个产品销售额占总销售额的百分比。

Filters 过滤器聚合

示例场景:分析不同分类产品的销售情况。
查询语句:

POST /products/_search
{
  "size": 0,
  "aggs": {
    "sales_by_category": {
      "filters": {
        "filters": {
          "electronics": { "term": { "category": "electronics" }},
          "books": { "term": { "category": "books" }},
          "other": { "match_all": {} }
        }
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

我们使用了filters聚合来按产品分类过滤文档,并在每个过滤器内部使用sum聚合来计算总销售额。

七、聚合排序

八、优化建议


关注以下公众号获取更多深度内容,纯干货 !

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/qq_26664043/article/details/139906290","extend1":"pc","ab":"new"}">> id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type1" id="blog_extension"> class="blog_extension_card" data-report-click="{"spm":"1001.2101.3001.6470"}" data-report-view="{"spm":"1001.2101.3001.6470"}"> class="blog_extension_card_left"> class="blog_extension_card_cont"> class="blog_extension_card_cont_l"> 码到三十五 class="blog_extension_card_cont_r"> 微信公众号 纯技术干货
注:本文转载自blog.csdn.net的码到三十五的文章"https://blog.csdn.net/qq_26664043/article/details/139906290"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!