ES指标聚合,就是类似SQL的统计函数,指标聚合可以单独使用,也可以跟桶聚合一起使用,下面介绍golang如何使用ES的指标聚合。
不了解ES指标聚合相关知识,先看一下Elasticsearch 指标聚合教程
1. Value Count
值聚合,主要用于统计文档总数,类似SQL的count函数。
package main
import (
"context"
"fmt"
"github.com/olivere/elastic/v7"
"time"
)
func main() {
// 创建ES client
client, err := elastic.NewClient()
if err != nil {
// Handle error
panic(err)
}
// 执行ES请求需要提供一个上下文对象
ctx := context.Background()
// 创建Value Count指标聚合
aggs := elastic.NewValueCountAggregation().
Field("order_id") // 设置统计字段
searchResult, err := client.Search().
Index("kibana_sample_data_flights"). // 设置索引名
Query(elastic.NewMatchAllQuery()). // 设置查询条件
Aggregation("total", aggs). // 设置聚合条件,并为聚合条件设置一个名字, 支持添加多个聚合条件,命名不一样即可。
Size(0). // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
Do(ctx) // 执行请求
if err != nil {
// Handle error
panic(err)
}
// 使用ValueCount函数和前面定义的聚合条件名称,查询结果
agg, found := searchResult.Aggregations.ValueCount("total")
if found {
// 打印结果,注意:这里使用的是取值运算符
fmt.Println(*agg.Value)
}
}
提示:go elastic库,所有聚合分析结果都是通过对应的函数获取结果,例如前面的例子,Value Count聚合结果,通过ValueCount函数获取结果,后面继续介绍其他指标聚合的用法。
2.Cardinality
基数聚合,也是用于统计文档的总数,跟Value Count的区别是,基数聚合会去重,不会统计重复的值,类似SQL的count(DISTINCT 字段)用法。
提示:基数聚合是一种近似算法,统计的结果会有一定误差,不过性能很好。
// 创建Cardinality指标聚合
aggs := elastic.NewCardinalityAggregation().
Field("order_id") // 设置统计字段
searchResult, err := client.Search().
Index("kibana_sample_data_flights"). // 设置索引名
Query(elastic.NewMatchAllQuery()). // 设置查询条件
Aggregation("total", aggs). // 设置聚合条件,并为聚合条件设置一个名字
Size(0). // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
Do(ctx) // 执行请求
if err != nil {
// Handle error
panic(err)
}
// 使用Cardinality函数和前面定义的聚合条件名称,查询结果
agg, found := searchResult.Aggregations.Cardinality("total")
if found {
// 打印结果,注意:这里使用的是取值运算符
fmt.Println(*agg.Value)
}
3.Avg
求平均值
// 创建Avg指标聚合
aggs := elastic.NewAvgAggregation().
Field("price") // 设置统计字段
searchResult, err := client.Search().
Index("kibana_sample_data_flights"). // 设置索引名
Query(elastic.NewMatchAllQuery()). // 设置查询条件
Aggregation("avg_price", aggs). // 设置聚合条件,并为聚合条件设置一个名字
Size(0). // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
Do(ctx) // 执行请求
if err != nil {
// Handle error
panic(err)
}
// 使用Avg函数和前面定义的聚合条件名称,查询结果
agg, found := searchResult.Aggregations.Avg("avg_price")
if found {
// 打印结果,注意:这里使用的是取值运算符
fmt.Println(*agg.Value)
}
4.Sum
求和计算
// 创建Sum指标聚合
aggs := elastic.NewSumAggregation().
Field("price") // 设置统计字段
searchResult, err := client.Search().
Index("kibana_sample_data_flights"). // 设置索引名
Query(elastic.NewMatchAllQuery()). // 设置查询条件
Aggregation("total_price", aggs). // 设置聚合条件,并为聚合条件设置一个名字
Size(0). // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
Do(ctx) // 执行请求
if err != nil {
// Handle error
panic(err)
}
// 使用Sum函数和前面定义的聚合条件名称,查询结果
agg, found := searchResult.Aggregations.Sum("total_price")
if found {
// 打印结果,注意:这里使用的是取值运算符
fmt.Println(*agg.Value)
}
5.Max
求最大值
// 创建Sum指标聚合
aggs := elastic.NewMaxAggregation().
Field("price") // 设置统计字段
searchResult, err := client.Search().
Index("kibana_sample_data_flights"). // 设置索引名
Query(elastic.NewMatchAllQuery()). // 设置查询条件
Aggregation("max_price", aggs). // 设置聚合条件,并为聚合条件设置一个名字
Size(0). // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
Do(ctx) // 执行请求
if err != nil {
// Handle error
panic(err)
}
// 使用Max函数和前面定义的聚合条件名称,查询结果
agg, found := searchResult.Aggregations.Max("max_price")
if found {
// 打印结果,注意:这里使用的是取值运算符
fmt.Println(*agg.Value)
}
6.Min
求最小值
// 创建Min指标聚合
aggs := elastic.NewMinAggregation().
Field("price") // 设置统计字段
searchResult, err := client.Search().
Index("kibana_sample_data_flights"). // 设置索引名
Query(elastic.NewMatchAllQuery()). // 设置查询条件
Aggregation("min_price", aggs). // 设置聚合条件,并为聚合条件设置一个名字
Size(0). // 设置分页参数 - 每页大小,设置为0代表不返回搜索结果,仅返回聚合分析结果
Do(ctx) // 执行请求
if err != nil {
// Handle error
panic(err)
}
// 使用Min函数和前面定义的聚合条件名称,查询结果
agg, found := searchResult.Aggregations.Min("min_price")
if found {
// 打印结果,注意:这里使用的是取值运算符
fmt.Println(*agg.Value)
}