Elastic Stack 笔记(七)Elasticsearch5.6 聚合分析
一、前言
Elasticsearch 是一个分布式的全文搜索引擎,索引和搜索是 Elasticsarch 的基本功能。同时,Elasticsearch 的聚合(Aggregations)功能也时分强大,允许在数据上做复杂的分析统计。ES 提供的聚合分析功能主要有指标聚合、桶聚合、管道聚合和矩阵聚合。需要主要掌握的是前两个,即指标聚合和桶聚合。
聚合分析的官方文档:Aggregations
二、聚合分析
2.1 指标聚合
指标聚合官网文档:Metric
指标聚合中主要包括 min、max、sum、avg、stats、extended_stats、value_count 等聚合,相当于 SQL 中的聚合函数。
指标聚合中包括如下聚合:
- Avg Aggregation
- Cardinality Aggregation
- Extended Stats Aggregation
- Geo Bounds Aggregation
- Geo Centroid Aggregation
- Max Aggregation
- Min Aggregation
- Percentiles Aggregation
- Percentile Ranks Aggregation
- Scripted Metric Aggregation
- Stats Aggregation
- Sum Aggregation
- Top Hits Aggregation
- Value Count Aggregation
Aggregations that keep track and compute metrics over a set of documents.
在一组文档中跟踪和计算度量的聚合。如下以 max 聚合为例:
Max Aggregation
max 聚合官网文档:Max Aggregation
max 聚合用于最大值统计,与 SQL 中的聚合函数 max() 的作用类似,其中 "max_price" 为自定义的聚合名称。
##Max Aggregation
GET books/_search
{
"size": 0,
"aggs": {
"max_price": {
"max": {
"field": "price"
}
}
}
}
返回结果如下:
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": 0,
"hits": []
},
"aggregations": {
"max_price": {
"value": 81.4
}
}
}
Cardinality Aggregation
基数统计聚合官网文档:Cardinality Aggregation
Cardinality Aggregation 用于基数查询,其作用是先执行类似 SQL 中的 distinct 操作,去掉集合中的重复项,然后统计排重后的集合长度。
##Cardinality Aggregation
GET books/_search
{
"size": 0,
"aggs": {
"all_language": {
"cardinality": {
"field": "language"
}
}
}
}
返回结果如下:
{
"took": 41,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": 0,
"hits": []
},
"aggregations": {
"all_language": {
"value": 3
}
}
}
Stats Aggregation
基本统计聚合官网文档:Stats Aggregation
Stats Aggregation 用于基本统计,会一次返回 count、max、min、avg 和 sum 这 5 个指标。如下:
##Stats Aggregation
GET books/_search
{
"size": 0,
"aggs": {
"stats_pirce": {
"stats": {
"field": "price"
}
}
}
}
返回结果如下:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": 0,
"hits": []
},
"aggregations": {
"stats_pirce": {
"count": 5,
"min": 46.5,
"max": 81.4,
"avg": 63.8,
"sum": 319
}
}
}
Extended Stats Aggregation
高级统计聚合官网文档:Extended Stats Aggregation
用于高级统计,和基本统计功能类似,但是会比基本统计多4个统计结果:平方和、方差、标准差、平均值加/减两个标准差的区间。
##Extended Stats Aggregation
GET books/_search
{
"size": 0,
"aggs": {
"extend_stats_pirce": {
"extended_stats": {
"field": "price"
}
}
}
}
返回响应结果:
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": 0,
"hits": []
},
"aggregations": {
"extend_stats_pirce": {
"count": 5,
"min": 46.5,
"max": 81.4,
"avg": 63.8,
"sum": 319,
"sum_of_squares": 21095.46,
"variance": 148.65199999999967,
"std_deviation": 12.19229264740638,
"std_deviation_bounds": {
"upper": 88.18458529481276,
"lower": 39.41541470518724
}
}
}
}
Value Count Aggregation
文档数量聚合官网文档:Value Count Aggregation
Value Count Aggregation 可按字段统计文档数量。
##Value Count Aggregation
GET books/_search
{
"size": 0,
"aggs": {
"doc_count": {
"value_count": {
"field": "author"
}
}
}
}
返回结果如下:
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": 0,
"hits": []
},
"aggregations": {
"doc_count": {
"value": 5
}
}
}
注意:
text 类型的字段不能做排序和聚合(terms Aggregation 除外),如下对 title 字段做聚合,title 定义为 text:
GET books/_search
{
"size": 0,
"aggs": {
"doc_count": {
"value_count": {
"field": "title"
}
}
}
}
返回结果如下:
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [title] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
}
],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [
{
"shard": 0,
"index": "books",
"node": "6n3douACShiPmlA9j2soBw",
"reason": {
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [title] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
}
}
]
},
"status": 400
}
2.2 桶聚合
桶聚合官网文档:Bucket Aggregations
Bucket 可以理解为一个桶,它会遍历文档中的内容,凡是符合某一要求的就放入一个桶中,分桶相当与 SQL 中 SQL 中的 group by。
桶聚合包括如下聚合:
- Adjacency Matrix Aggregation
- Children Aggregation
- Composite Aggregation
- Date Histogram Aggregation
- Date Range Aggregation
- Diversified Sampler Aggregation
- Filter Aggregation
- Filters Aggregation
- Geo Distance Aggregation
- GeoHash grid Aggregation
- Global Aggregation
- Histogram Aggregation
- IP Range Aggregation
- Missing Aggregation
- Nested Aggregation
- Range Aggregation
- Reverse nested Aggregation
- Sampler Aggregation
- Significant Terms Aggregation
- Significant Text Aggregation
- Terms Aggregation
terms Aggregation 用于分组聚合,统计属于各编程语言的书籍数量,如下:
GET books/_search
{
"size": 0,
"aggs": {
"terms_count": {
"terms": {
"field": "language"
}
}
}
}
返回结果如下:
{
"took": 31,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": 0,
"hits": []
},
"aggregations": {
"terms_count": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "java",
"doc_count": 2
},
{
"key": "python",
"doc_count": 2
},
{
"key": "javascript",
"doc_count": 1
}
]
}
}
}
在 terms 分桶的基础上,还可以对每个桶进行指标聚合。例如,想统计每一类图书的平局价格,可以先按照 language 字段进行 Terms Aggregation,再进行 Avg Aggregattion,查询语句如下:
GET books/_search
{
"size": 0,
"aggs": {
"terms_count": {
"terms": {
"field": "language"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
返回结果如下:
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": 0,
"hits": []
},
"aggregations": {
"terms_count": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "java",
"doc_count": 2,
"avg_price": {
"value": 58.35
}
},
{
"key": "python",
"doc_count": 2,
"avg_price": {
"value": 67.95
}
},
{
"key": "javascript",
"doc_count": 1,
"avg_price": {
"value": 66.4
}
}
]
}
}
}
Range Aggregation
Range Aggregation 是范围聚合,用于反映数据的分布情况。比如,对 books 索引中的图书按照价格区间在 0~50、50~80、80 以上进行范围聚合,如下:
GET books/_search
{
"size": 0,
"aggs": {
"price_range": {
"range": {
"field": "price",
"ranges": [
{"to": 50},
{"from": 50, "to": 80},
{"from": 80}
]
}
}
}
}
返回结果如下:
{
"took": 16,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": 0,
"hits": []
},
"aggregations": {
"price_range": {
"buckets": [
{
"key": "*-50.0",
"to": 50,
"doc_count": 1
},
{
"key": "50.0-80.0",
"from": 50,
"to": 80,
"doc_count": 3
},
{
"key": "80.0-*",
"from": 80,
"doc_count": 1
}
]
}
}
}
Range Aggregation 不仅可以对数值型字段进行范围统计,也可以作用在日期类型上。Date Range Aggregation 专门用于日期类型的范围聚合,和 Range Aggregation 的区别在于日期的起止值可以使用数学表达式。
2.3 管道聚合
管道聚合官网文档:Pipeline Aggregations
- Avg Bucket Aggregation
- Derivative Aggregation
- Max Bucket Aggregation
- Min Bucket Aggregation
- Sum Bucket Aggregation
- Stats Bucket Aggregation
- Extended Stats Bucket Aggregation
- Percentiles Bucket Aggregation
- Moving Average Aggregation
- Cumulative Sum Aggregation
- Bucket Script Aggregation
- Bucket Selector Aggregation
- Bucket Sort Aggregation
- Serial Differencing Aggregation
Pipeline Aggregations 处理的对象是其他聚合的输出(而不是文档)。
2.4 矩阵聚合
矩阵聚合官网文档:Matrix Aggregations
Matrix Stats 聚合是一种面向数值型的聚合,用于计算一组文档字段中的以下统计信息:
计数:计算过程中每种字段的样本数量;
平均值:每个字段数据的平均值;
方差:每个字段样本数据偏离平均值的程度;
偏度:量化每个字段样本数据在平均值附近的非对称分布情况;
峰度:量化每个字段样本数据分布的形状;
协方差:一种量化描述一个字段数据随另一个字段数据变化程度的矩阵;
相关性:描述两个字段数据之间的分布关系,其协方差矩阵取值在[-1,1]之间。
主要用于计算两个数值型字段之间的关系。如对日志记录长度和 HTTP 状态码之间关系的计算。
GET /_search
{
"aggs": {
"statistics": {
"matrix_stats": {
"fields": ["log_size", "status_code"]
}
}
}
}
Elastic Stack 笔记(七)Elasticsearch5.6 聚合分析的更多相关文章
- Elastic Stack 笔记(八)Elasticsearch5.6 Java API
博客地址:http://www.moonxy.com 一.前言 Elasticsearch 底层依赖于 Lucene 库,而 Lucene 库完全是 Java 编写的,前面的文章都是发送的 RESTf ...
- Elastic Stack 笔记(一)CentOS7.5 搭建 Elasticsearch5.6 集群
博客地址:http://www.moonxy.com 一.前言 Elasticsearch 是一个基于 Lucene 的分布式搜索引擎服务,采用 Java 语言编写,使用 Lucene 构建索引.提供 ...
- Elastic Stack 笔记(四)Elasticsearch5.6 索引及文档管理
博客地址:http://www.moonxy.com 一.前言 在 Elasticsearch 中,对文档进行索引等操作时,既可以通过 RESTful 接口进行操作,也可以通过 Java 也可以通过 ...
- Elastic Stack 笔记(三)Kibana5.6 安装
博客地址:http://www.moonxy.com 一.前言 Kibana 是 Elastic Stack 公司推出的一个针对 Elasticsearch 的开源分析及可视化平台,可以搜索.查看存放 ...
- Elasticsearch学习笔记(三)聚合分析Agg
一.设置fielddata PUT /index/_mapping/type { "properties":{ "fieldName" ...
- Elastic Stack 笔记(十)Elasticsearch5.6 For Hadoop
博客地址:http://www.moonxy.com 一.前言 ES-Hadoop 是连接快速查询和大数据分析的桥梁,它能够无间隙的在 Hadoop 和 ElasticSearch 上移动数据.ES ...
- Elastic Stack 笔记(二)Elasticsearch5.6 安装 IK 分词器和 Head 插件
博客地址:http://www.moonxy.com 一.前言 Elasticsearch 作为开源搜索引擎服务器,其核心功能在于索引和搜索数据.索引是把文档写入 Elasticsearch 的过程, ...
- Elastic Stack 笔记(六)Elasticsearch5.6 搜索详解
博客地址:http://www.moonxy.com 一.前言 Elasticsearch 主要包含索引过程和搜索过程. 索引过程:一条文档被索引到 Elasticsearch 之后,默认情况下 ES ...
- Elastic Stack 笔记(九)Elasticsearch5.6 集群管理
博客地址:http://www.moonxy.com 一.前言 集群搭建好以后,在日常中就要对集群的使用情况进行监控,对于一个多节点集群,由于网络连接问题,出现宕机.脑裂等异常情况都是有可能发生的.E ...
随机推荐
- windows如何访问wsl系统下的文件
windows如何访问wsl系统下的文件 可以在wsl终端输入以下命令 explorer.exe . 会出现如下界面 这样就可以很方便的查看wsl的文件了
- js作用域链和预编译
js引擎运行分为两步,预解析 代码执行 (1)预解析: js引擎会拿js里面所有的var还有 function 提升到当前作用域的最前面 (2)代码执行:按照代码书写的顺序从上往下执行 预解析分为:变 ...
- Selenium+java - 手把手一起搭建一个最简单自动化测试框架
写在前面 我们刚开始做自动化测试,可能写的代码都是基于原生写的代码,看起来特别不美观,而且感觉特别生硬. 来看下面一段代码,如下图所示: 从上面图片代码来看,具体特征如下: driver对象在测试类中 ...
- 利用ShardingSphere-JDBC实现分库分表
利用ShardingSphere-JDBC实现分库分表 1. ShardingSphere概述 1.1 概述 业务发展到一定程度,分库分表是一种必然的要求,分库可以实现资源隔离,分表则可以降低单表数据 ...
- SpringBoot中关于Shiro权限管理的整合使用
转载:https://blog.csdn.net/fuweilian1/article/details/80309192 在整合Shiro的时候,我们先要确定一下我们的步骤: 1.加入Shiro的依 ...
- 解决mysql乱码
总结的几个乱码问题 希望我们全体学员也能够学会总结 java web 很是希望大家能够学好.并且也希望大家能够在学习过程中不段的积累相关的知识点 1.在response中写<meta http ...
- 90002CAD相关操作
第一章 初识CAD 1.1 CAD能干什么 (1)绘制机械图/建筑图/装修图等二维复杂工程图的不二之选.二维设计软件的王者. (2)CAD可以绘制平面图.轴测图(二维线框表示三维图形).立体图(三 ...
- Linux软件包管理(12)
RPM包管理: RPM(RedHat Package Manager),早期是在RedHat发行版下,由于比较火,所以慢慢运行于各个发行版(如suse,centos等). 它生成具有.RPM扩展名的文 ...
- LightOJ - 1370 Bi-shoe and Phi-shoe 欧拉函数 题解
题目: Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popula ...
- ubuntu 用户无法/循环登陆的问题
安装oracle数据库的时候需要新建用户oracle,使用的命令为:useradd oracle.这样做直接创建了用户oracle,但并没有在home目录下创建oracle用户的文件.在log out ...