一架梯子,一头程序猿,仰望星空!

golang elasticsearch指标聚合(metrics)


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