Es 聚合查询

ElasticSearch Aggs

Posted by gomyck on October 18, 2022

ElasticSearch聚合函数的例子代码, 留以查找使用

ES 的聚合函数分为: 桶聚合函数, 度量函数, 管道聚合函数

其中, 桶聚合函数, 可以理解为使用的 sql group by 后面的条件

度量函数, 可以理解为 sql 中的查询聚合函数: avg , sum, min, max

管道聚合函数, 则是把各个分组在聚合在一起计算的函数, 比如计算经过 color 分组之后, 每个分组内的某一个属性, 有什么特征, 在度量计算

因为其功能庞大, 在使用时, 需要查找翻看 es 的权威指南来实现具体的业务场景, 本文只简单记录两个模版方法, 用于快速记忆, 具体使用还是要参考当前环境版本的 es 权威指南来操作

简单的聚合

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

可能会注意到我们将 size 设置成 0 。我们并不关心搜索结果的具体内容,所以将返回记录数设置为 0 来提高查询速度。 设置 size: 0 与 Elasticsearch 1.x 中使用 count 搜索类型等价。

度量指标

select count(1) as doc_count, avg(price) as avg_price from transactions group by color

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": {
            "avg_price": {
               "avg": {
                  "field": "price"
               }
            }
         }
      }
   }
}

"aggregations": {
  "colors": {
     "buckets": [
        {
           "key": "red",
           "doc_count": 4,
           "avg_price": {
              "value": 32500
           }
        },
        {
           "key": "blue",
           "doc_count": 2,
           "avg_price": {
              "value": 20000
           }
        }
     ]
  }
}

更高级的嵌套使用方式参考: https://www.elastic.co/guide/cn/elasticsearch/guide/current/_one_final_modification.html

更多聚合操作指引查询: https://www.elastic.co/guide/en/elasticsearch/reference/8.4/search-aggregations.html