ES 提供了三种聚合方式,分别是桶聚合,指标聚合和管道聚合。 类似于SQL:

  1. SELECT COUNT(color)
  2. FROM table
  3. GROUP BY color

ElasticSearch中在概念上类似于 SQL 的分组(GROUP BY),而指标则类似于 COUNT() 、 SUM() 、 MAX() 等统计方法。
进而引入了两个概念:

  • 桶(Buckets) 满足特定条件的文档的集合
  • 指标(Metrics) 对桶内的文档进行统计计算

所以ElasticSearch包含3种聚合(Aggregation)方式

  • 桶聚合(Bucket Aggregation)
  • 指标聚合(Metric Aggregation)
  • 管道聚合(Pipline Aggregation)
    • 聚合管道化,简单而言就是上一个聚合的结果成为下个聚合的输入;

注意:桶聚合和指标聚合很多情况下是可以一起使用的,桶聚合是特殊的指标聚合,聚合指标就是数据的条数count。

有用的链接

https://pdai.tech/md/db/nosql-es/elasticsearch-x-agg-bucket.html

ES 聚合理解思路

image.png

桶聚合

准备数据

  1. POST /test-agg-cars/_bulk
  2. { "index": {}}
  3. { "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
  4. { "index": {}}
  5. { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
  6. { "index": {}}
  7. { "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
  8. { "index": {}}
  9. { "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
  10. { "index": {}}
  11. { "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
  12. { "index": {}}
  13. { "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
  14. { "index": {}}
  15. { "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
  16. { "index": {}}
  17. { "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }

标准聚合

  1. GET /test-agg-cars/_search
  2. {
  3. "size" : 0,
  4. "aggs" : {
  5. "popular_colors" : {
  6. "terms" : {
  7. "field" : "color.keyword"
  8. }
  9. }
  10. }
  11. }

聚合参数

  1. 聚合操作被置于顶层参数 aggs 之下(如果你愿意,完整形式 aggregations 同样有效)。
  2. 指定聚合名称
  3. 指定每个桶的类型,即根据哪个字段聚合。(本例中根据color字段聚合)

    多聚合

    可以同时计算多个桶的结果,即根据多个字段进行聚合,每个聚合结果互不影响。注意和嵌套聚合的区别: ```json GET /test-agg-cars/_search { “size” : 0, “aggs” : {
    1. "popular_colors" : {
    2. "terms" : {
    3. "field" : "color.keyword"
    4. }
    5. },
    6. "make_by" : {
    7. "terms" : {
    8. "field" : "make.keyword"
    9. }
    10. }
    } }
  1. <a name="ftjdv"></a>
  2. ## 嵌套聚合
  3. 在聚合桶内进行在聚合,如下面的例子,按照颜色聚合后再计算每个桶内的平均price。
  4. ```json
  5. GET /test-agg-cars/_search
  6. {
  7. "size" : 0,
  8. "aggs": {
  9. "colors": {
  10. "terms": {
  11. "field": "color.keyword"
  12. },
  13. "aggs": {
  14. "avg_price": {
  15. "avg": {
  16. "field": "price"
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }

动态脚本的聚合

GET /test-agg-cars/_search
{
  "runtime_mappings": {
    "make.length": {
      "type": "long",
      "script": "emit(doc['make.keyword'].value.length())"
    }
  },
  "size" : 0,
  "aggs": {
    "make_length": {
      "histogram": {
        "interval": 1,
        "field": "make.length"
      }
    }
  }
}

前置条件过滤:filter