- 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条)