Elasticsearch 聚合分析深入学习

聚合分析运算是数据库中重要的特性,对于数据分析场景尤为重要。类似于关系型数据库中的 SUM,AVG, GROUP BY 等,Elasticsearch 也提供了丰富的聚合运算方式,可以满足大部分分析和查询场景。

Doc Values 和 Field Data

在学习聚合分析之前,我们先了解一下 Doc Values 和 Field Data 数据结构,我们知道倒排索引的优势在于查找包含某个项的文档,反过来确定哪些项是否在某个文档中并不高效,ES 为了满足排序、聚合以及执行脚本的需求,因此就出现了 Doc Values 和 Field Data 两种数据结构,一般对应的数据结构如下:

Doc      Terms
-----------------------------------------------------------------
Doc_1 | brown, dog, fox, jumped, lazy, over, quick, the
Doc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summer
Doc_3 | dog, dogs, fox, jumped, over, quick, the
Doc Values
  • Doc Values 在索引生成时创建,通过序列持久化数据结构存储到磁盘,可以以操作系统的文件缓存来代替 JVM heap
  • Doc Values 不支持分词的字符串,如果想要分词的字符串进行聚合功能,可以看下面的 Field Data 数据结构
  • 设置字段属性 doc_values=false 可以关闭 Doc Values 功能,意味你不可以对该字段进行聚合、排序等,同时也可以节省磁盘空间
Field Data
  • Field Data 构建和管理 100% 在内存中,常驻于 JVM 内存堆,会消耗大量的内存,开启时需要谨慎考虑
  • 早起版本所有类型字段的默认设置都是 Field Data,后面大部分类型字段都迁移到了 Doc Values,只留下分词字符串还使用 Field Data
  • text 类型默认是 Field Data 功能的,如果需要可以通过设置属性 fielddata=true 开启该功能
  • Field Data 是延迟加载的,也就是只有你第一次对一个分词字符串进行聚合、排序操作时才会加载,所以第一次加载时查询会较慢
  • indices.fielddata.cache.size:可以通过设置该选项来限制 Field Data 占用堆空间大小,默认是没有上限的,例如可以设置为 50% 或者 12 G,如果超过该限制,就会使用 LRU 算法进行内存回收
  • fielddata_frequency_filter:为了限制 Field Data 使用大量的内存,我们可以设置一些筛选条件只有满足该条件时才加载 Field Data
PUT my_index
{
  "mappings": {
    "properties": {
      "tag": {
        "type": "text",
        "fielddata": true,
        "fielddata_frequency_filter": {
          "min": 0.001,   //只有那些至少在本段文档中出现的词频在0.1% 和 10% 之间的文档到内存中
          "max": 0.1,
          "min_segment_size": 500  //忽略任何文档个数小于 500 的 segment
        }
      }
    }
  }
}

基本概念

聚合分析分类
  • Metric Aggregation: 指标分析聚合,比如计算某些指标的平均值、最大值,求和
  • Bucket Aggregation: 分桶聚合,类似于关系型数据库中的 Group By 语法,根据一定规则按照维度进行划分成不同的桶
  • Pipeline: 管道分析类型,可以基于已有的聚合结果进行二次聚合运算
  • Matrix: 矩阵分析类型
聚合分析格式

下面使用一个例子来说明聚合分析查询格式:

//查询 employees 工资的最小值
POST employees/_search
{
  "size": 0,  //我们一般情况下只关心聚合分析的结果,所有原数据项的查询 size 设置为 0
  "aggs": {   //聚合分析关键词,也可以写成 aggregations
    "min_salary": { //自定义的聚合分析名称,一般起有意义的名称,用于在返回结果中找到分析结果 
      "min": {      // 聚合分析类型,
        "field":"salary"   //分析的主体,表示根据哪些字段信息进行聚合
      }
    }
  }
}

Metric Aggregation

Metric Aggregation 主要分为两类:单值分析(输出单个结果)和多值分析(输出多个结果)。

单值分析
  • 单值分析主要包括 min、max、avg、sum、cardinality,weight avg,value count
  • weight avg 在计算平均数时会使用另外一个字段作为每个文档的权重,比如 score = 99 学生有 3 个,score = 85 的学生有 5 个,求平均分数,人数就是这里的 weight
  • cardinality 类似于关系数据库中的 distinct count
  • value count 统计某字段所有有值的文档数
  • 可以同时使用多个单值分析关键词返回多个结果
//同时返回员工中的最低薪水和最高薪水
POST employees/_search
{
  "size": 0,  
  "aggs": {  
    "min_salary": { 
      "min": {     
        "field":"salary"  
      }
    },
    "max_salary": {
      "max": {    
        "field":"salary"  
      }
    }
  }
}
多值分析
  • stats:一次性返回 min、max、avg、sum、cardinality,weight avg,value count 的所有单值结果
  • extended_stats:对 stats 进行扩展,包含更多,如:方差,标准差,标准差等
  • percentile:百分位数统计,比如用于统计 95% 的员工工资都小于某个值或者大于某个值
//查询 latency 索引中 95%, 99%, 99.9% 的文档的 load_time 都分别大于哪些值
GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_outlier" : {
            "percentiles" : {
                "field" : "load_time"  //根据 load_time 字段计算百分比
            },
            "percents" : [95, 99, 99.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值