
- Elasticsearch 聚合使用
- 前言
- 聚合使用
- 指标聚合
- 统计字段有值的数据总数
- cardinality 去重计数
- stats 统计
- Extended stats 统计
- percentile_ranks
- 桶 聚合
- having 过滤
es入门使用
es索引使用
es分词使用
通常在业务开发中我们需要统计报表或对一些数据进行统计,在关系型数据库中我们通常使用sql 如max min sum count group by 等配合使用进行数据统计,也可能在业务代码中进行一些数据计算,那么在es中是如何使用的呢?
聚合使用聚合分析是es中比较重要的功能特性,完成对一个查询数据集中数据的聚合计算,如:需要找出某个字段的最大值,最小值,平均值,计算综合,平均值等。同样的es作为搜索引擎兼数据库,也提供了强大的聚合分析功能。
对于一个数据集求平均值,求和,最大,最小等指标聚合,在es中被称为指标聚合metric,在关系db中还可以使用group by进行分组计算,同样es中group by被称为桶聚合 Bucketing
聚合语法
如min max avg sum
# 聚合查询
POST /elasticsearch_test/_search
{
"size": 0,
"aggs": {
"max_price": {
"max": {
"field": "price"
}
},
"min_pice":{
"avg": {
"field": "price"
}
},
"sum_price":{
"sum": {
"field": "price"
}
},
"avg_price":{
"avg": {
"field": "price"
}
}
}
}
结果如下
统计行数
# 统计行数 统计price 大于等于6的数据
POST /elasticsearch_test/_search
{
"query": {
"range": {
"price": {
"gte": 6
}
}
}
}
如下图 符合条件的3条数据
# 统计字段有值的数据总数
POST /elasticsearch_test/_search
{
"aggs": {
"price_count": {
"value_count": {
"field": "price"
}
}
}
}
这里有7条数据
实际上price价格相同的数据存在好几条,sql中我们使用 disctinct 和 group by 可以去重,es中我们可以使用cardinality 去重计数
# cardinality 去重计数
POST /elasticsearch_test/_search
{
"aggs": {
"id_count": {
"cardinality": {
"field": "_id"
}
},
"price_count": {
"cardinality": {
"field": "price"
}
}
}
}
去重后的数据
统计 avg max min sum count 这五个统计
# stats 统计 avg max min sum count 这五个统计
POST /elasticsearch_test/_search
{
"aggs": {
"price_stats": {
"stats": {
"field": "price"
}
}
}
}
可以看到不需要额外的每个max min sum count avg 都写一遍 ,直接全部统计出来
Extended stats 统计Extended stats 统计 比 stats多 平方和 方差 标准差 平均值加/减两个标准差的区间
# Extended stats 统计 比 stats多 平方和 方差 标准差 平均值加/减两个标准差的区间
POST /elasticsearch_test/_search
{
"aggs": {
"price_stats": {
"extended_stats": {
"field": "price"
}
}
}
}
可以看到这个统计更详细,不过我们最常用上面五个就可以了
percents 指定分位值
# 占比百分比对应的统计值 percents 指定分位值 占比百分位对应值的统计
POST /elasticsearch_test/_search
{
"aggs": {
"price_stats": {
"percentiles": {
"field": "price",
"percents": [
0,
5,
90,
100
]
}
}
}
}
percentile_ranks
统计值小于等于指定值的文档占比
# percentile_ranks 统计值小于等于指定值的文档占比
POST /elasticsearch_test/_search
{
"aggs": {
"price_aggs": {
"percentile_ranks": {
"field": "price",
"values": [
0,
5,
5.6,
10,
15,
900,
990
]
}
}
}
}
桶 聚合
桶 聚合 相当于sql中的group by 统计
# 桶 聚合 相当于sql中的group by 统计
POST /elasticsearch_test/_search
{
"aggs": {
"group_by_price": {
"range": {
"field": "price",
"ranges": [
{
"from": 0,
"to": 10
},
{
"from": 10,
"to": 90
}
,
{
"from": 90,
"to": 100
},
{
"from": 100,
"to": 1000
}
]
},
"aggs": {
"price_aggs": {
"max": {
"field": "price"
}
},
"avg_price": {
"avg": {
"field": "price"
}
},
"count_price":{
"value_count": {
"field": "price"
}
}
}
}
}
}
这里可以看到不同价格区间里的数据统计
"aggregations" : {
"group_by_price" : {
"buckets" : [
{
"key" : "0.0-10.0",
"from" : 0.0,
"to" : 10.0,
"doc_count" : 4,
"count_price" : {
"value" : 4
},
"price_aggs" : {
"value" : 5.599999904632568
},
"avg_price" : {
"value" : 5.599999904632568
}
},
{
"key" : "10.0-90.0",
"from" : 10.0,
"to" : 90.0,
"doc_count" : 0,
"count_price" : {
"value" : 0
},
"price_aggs" : {
"value" : null
},
"avg_price" : {
"value" : null
}
},
{
"key" : "90.0-100.0",
"from" : 90.0,
"to" : 100.0,
"doc_count" : 0,
"count_price" : {
"value" : 0
},
"price_aggs" : {
"value" : null
},
"avg_price" : {
"value" : null
}
},
{
"key" : "100.0-1000.0",
"from" : 100.0,
"to" : 1000.0,
"doc_count" : 3,
"count_price" : {
"value" : 3
},
"price_aggs" : {
"value" : 990.0
},
"avg_price" : {
"value" : 396.6666666666667
}
}
]
}
}
}
having 过滤
# having 过滤
# bucket_selector: 过滤条件字段 script:写过滤逻辑
POST /elasticsearch_test/_search
{
"aggs": {
"group_by_price": {
"range": {
"field": "price",
"ranges": [
{
"from": 0,
"to": 10
},
{
"from": 10,
"to": 90
}
,
{
"from": 90,
"to": 100
},
{
"from": 100,
"to": 1000
}
]
},
"aggs": {
"price_aggs": {
"max": {
"field": "price"
}
},
"avg_price": {
"avg": {
"field": "price"
}
},
"count_price":{
"value_count": {
"field": "price"
}
},
"having":{
"bucket_selector": {
"buckets_path": {
"avg_price": "avg_price"
},
"script": "params.avg_price > 6"
}
}
}
}
}
}
这里我们分组统计后 最后使用having过滤平均价格大于6的数据
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)