ES之聚合查询
聚合类型
Metric (指标)聚合:指标分析类型,对数据进行统计分析 ,如计算最大值、最小值、平均值等等 (对桶内的文档进行聚合分析的操作) (max, min, avg)
Bucket (桶)聚合:分桶类型,获得分桶/分类数据, 类似SQL中的GROUP BY语法 (满足特定条件的文档的集合) (terms, cardinality, range)
Bucket 和 Metric 聚合协作: Bucket 可以嵌套 Bucket,可以包含 Metric
Pipeline(管道)聚合:管道分析类型,对聚合结果进行聚合 (min_bucket, max_bucket, avg_bucket, sum_bucket, stats_bucket, extended_stats_bucket, percentiles_bucket)
Matrix(矩阵): 矩阵分析类型(聚合是一种面向数值型的聚合,用于计算一组文档字段中的统计信息)
一、简单聚合
1.根据字段num分组,汇总条数(例)
【GET】请求:http://127.0.0.1:9200/test-index-1/_search,参数如下
{
"aggs" : { //聚合操作
"num_group" : { //聚合名称,随意起
"terms" : { //分组
"field" : "num" //分组字段
}
}
},
"size" : 0 //由于会返回原始数据,这里将hits里返回的原始数据变为0
}
返回结果为:
{
"aggregations": {
"num_group": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 5,
"doc_count": 4
},
{
"key": 1,
"doc_count": 1
},
{
"key": 2,
"doc_count": 1
},
{
"key": 3,
"doc_count": 1
},
{
"key": 4,
"doc_count": 1
}
]
}
}
}
2.求字段num的平均值(例)
【GET】请求:http://127.0.0.1:9200/test-index-1/_search,参数如下
{
"aggs" : {
"num_avg" : {
"avg" : {
"field" : "num"
}
}
},
"size" : 0
}
返回结果为:
{
"aggregations": {
"num_avg": {
"value": 3.75
}
}
}
二、其他聚合方式
- date_histogram的使用,时间字段必须是date类型
date_histogram是按照时间来构建集合(桶)Buckts的,当我们需要按照时间进行做一些数据统计的时候,就可以使用它来进行时间维度上构建指标分析。
示例:
// 查询
"query": {
"bool": {
"must": [{
"range": {
"@timestamp": {
"gte": 1533556800000,
"lte": 1533806520000
}
}
}]
}
},
// 不显示具体的内容
"size": 0,
// 聚合
"aggs": {
// 自己取的聚合名字
"group_by_grabTime": {
// es提供的时间处理函数
"date_histogram": {
// 需要聚合分组的字段名称, 类型需要为date, 格式没有要求
"field": "@timestamp",
// 按什么时间段聚合, 这里是5分钟, 可用的interval在上面给出
"interval": "5m",
// 设置时区, 这样就相当于东八区的时间
"time_zone":"+08:00",
// 返回值格式化,HH大写,不然不能区分上午、下午
"format": "yyyy-MM-dd HH",
// 为空的话则填充0
"min_doc_count": 0,
// 需要填充0的范围
"extended_bounds": {
"min": 1533556800000,
"max": 1533806520000
}
},
// 聚合
"aggs": {
// 自己取的名称
"group_by_status": {
// es提供
"terms": {
// 聚合字段名
"field": "LowStatusOfPrice"
}
}
}
}
}
2.cardinality 即去重计算,类似sql中 count(distinct),先去重再求和,计算指定field值的种类数。
示例
POST bank/_doc/_search
{
"size": 0,
"aggs": {
"cartinality_gender": {
"cardinality": {
"field": "city.keyword"
}
}
}
返回:
"aggregations": {
"cartinality_gender": {
"value": 15
}
}