没有合适的资源?快使用搜索试试~ 我知道了~
聚合分析运算是数据库中重要的特性,对于数据分析场景尤为重要。类似于关系型数据库中的 SUM,AVG, GROUP BY 等,Elasticsearch 也提供了丰富的聚合运算方式,可以满足大部分分析和查询场景。 Doc Values 和 Field Data 在学习聚合分析之前,我们先了解一下 Doc Values 和 Field Data 数据结构,我们知道倒排索引的优势在于查找包含某个项的文档,反过来确定哪些项是否在某个文档中并不高效,ES 为了满足排序、聚合以及执行脚本的需求,因此就出现了 Doc Values 和 Field Data 两种数据结构,一般对应的数据结构如下: Doc
资源推荐
资源详情
资源评论
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.9] //设置百分比的点,默认是 [ 1, 5, 25, 50, 75, 95, 99 ] }
}
}
percentile rank:和 percentile 统计方向相反,比如用于统计工资小于 2 万的员工落在哪个百分比上
//用于统计 load_time 小于 500,600 的文档分别落在哪个百分比上
GET latency/_search
{
"size": 0,
"aggs" : {
"load_time_ranks" : {
"percentile_ranks" : {
"field" : "load_time",
"values" : [500, 600] }
}
}
}
top hits:一般用于分桶之后,获取每个桶内最匹配的前几个文档的列表,即详情数据,使用时一般需要带上排序信息
//用于查询 sales 索引中按照 type 字段进行聚合分桶,然后返回每个分桶中按照 date 字段降序后的 top 1 的所有文档
POST /sales/_search?size=0
{
"aggs": {
"top_tags": {
"terms": { //terms 分桶,后面会有讲解
剩余9页未读,继续阅读
资源评论
weixin_38544978
- 粉丝: 1
- 资源: 916
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功