ElasticSearch:aggregations 聚合详解

概念

ElasticSearch 中聚合的概念,通俗的讲就是按照一些条件从一个数据集中去统计一些信息,比如统计酒店房间有多少,根据价格区间统计酒店数量这些功能。
官网的解释:聚合可以进行各种组合以构建复杂的数据汇总。可以看作是在一组文档上建立分析信息的工作单元,统计一些文档集。聚合可以将一些独立的功能单元可以被混合在一起来满足你的需求,是一种单独的语法。
kibana的可视化看板就是非常经典的聚合功能的体现。

在这里插入图片描述
上图中的每个看板视图的展示,其实都是通过聚合API统计出来的一些数据,比如直方图分布,数据泊松分布等特性。

聚合

ElasticSearch 中有许多不同类型的聚合,每种聚合都有自己的功能和输出,聚合类型大致有四种基本类型。

  • Bucketing aggregation 一些满足特定条件的文档的集合,类似 mysql 的 group by。例如:select count(*) from user group by name, bucketing 的作用就是group by name,根据 name 去分组,返回一个特定条件的文档集合。
  • Metric aggregation 一些数学运算,对文档进行统计分析,例如:select count(*) from user group by name,count 就是 Metric 的作用,对结果集进行一些计算处理。
  • Matrix aggregation 对多个字段进行操作并且返回一个矩阵结果
  • Pipeline aggregation 对已经产生的聚合结果进行二次聚合

聚合的基本语法

  • aggs 是与query同级的,是聚合操作的根节点
  • aggregation_name 是自定义的聚合名字,是在聚合结果中展示的字段名
  • aggregation_type 是聚合的类型,比如 min,是 Metric 计算类型中的一种
  • aggregation_body 一般是要操作的计算值,如果是脚本则是脚本
    在这里插入图片描述
    在这里插入图片描述
    如上是一个简单的聚合语法,其中标识的地方分别对应语法中的操作。

Bucketing aggregation

bucketing的作用就是将文档进行一个分组,也就是 bucketing 的字面意思桶,ElasticSearch会将文档分成划分成为一个个的桶,ElasticSearch 提供了很多类型的 bucketing。

Terms Aggregation

就是一个最简单的分桶策略,也就是group by 策略,他是精确匹配,根据你指定的字段将值相等的文档分在一个桶中。

terms 是精确匹配,也是不分词,所以如果你想要对 text类型的使用terms,需要将field_data 开启

POST kibana_sample_data_flights/_search
{
   
  "size": 0,
  "aggs": {
   
    "country": {
   
      "terms": {
   
        "field": "OriginCountry"
      }
    }
  }
}

如上这条语义就是根据 OriginCountry 国家对航班信息进行 group by。

Filter Aggregation

Filter Aggregation,过滤聚合,其实就是添加了一个分桶的过滤匹配条件,只有符合这个条件的文档才会参与聚合统计。

  • filter 为要过滤的条件,语法可以参考查询语法,使用 term、match等都可以
POST kibana_sample_data_flights/_search
{
   
  "size": 0,
  "aggs": {
   
    "country": {
   
      "filter": {
   
        "term": {
   
          "OriginCountry": "US"
        }
      },
      "aggs": {
   
        "ticket": {
   
          "avg": {
   
            "field": "AvgTicketPrice"
          }
        }
      }
    }
  }
}

结果:
"aggregations" : {
   
    "country" : {
   
      "doc_count" : 2001,
      "ticket" : {
   
        "value" : 606.0703937315095
      }
    }
  }

上边这个结果就是只统计国家为us的飞机航班的平均票价,filter为要过滤的条件。

Filters Aggregation

Filters Aggregation 相当于是多个 Filter Aggregation,支持多个匹配条件,但是这里的多个并不是条件叠加,而是类似buckAPi那种的多个API分别执行,然后一次返回,省去网络IO。

POST kibana_sample_data_flights/_search
{
   
  "size": 0,
  "aggs": {
   
    "country": {
   
      "filters": {
   
        "filters": {
   
          "us": {
   
            "match": {
   
              "OriginCountry": "US"
            }
          },
          "cn": {
   
            "match": {
   
              "OriginCountry": "CN"
            }
          }
        }
      },
      "aggs": {
   
        "ticket": {
   
          "avg": {
   
            "field": "AvgTicketPrice"
          }
        }
      
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值