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" //分析的主体,表示根据哪些字段信息进行聚合