案例分析:统计聚合与分组聚合
在 Elasticsearch 中,统计聚合和分组聚合是两种常用的聚合方式,用于从数据中提取有用的信息和洞察。以下是两个实际案例,展示如何使用统计聚合和分组聚合来分析数据。
案例 1:统计聚合
目标:计算产品的价格统计信息,包括平均价格、总和、最小值、最大值和标准差。
数据集:假设我们有一个名为 products 的索引,其中包含多个产品的价格信息。
示例查询:
POST /products/_search
{
"size": 0,
"aggs": {
"price_stats": {
"stats": {
"field": "price"
}
}
}
}
解释:
size: 0:不返回任何文档,仅返回聚合结果。price_stats:聚合的名称。stats:统计聚合类型,计算字段的基本统计信息。field: "price":指定要计算统计信息的字段。
结果:
{
"aggregations": {
"price_stats": {
"count": 100,
"min": 10.0,
"max": 1000.0,
"avg": 150.5,
"sum": 15050.0,
"std_deviation": 200.25
}
}
}
分析:
count:产品总数。min:最低价格。max:最高价格。avg:平均价格。sum:总价格。std_deviation:价格的标准差。
案例 2:分组聚合
目标:按产品类别对价格进行分组,并计算每个类别的平均价格。
数据集:同样使用 products 索引,其中包含产品的类别信息和价格信息。
示例查询:
POST /products/_search
{
"size": 0,
"aggs": {
"by_category": {
"terms": {
"field": "category.keyword"
},
"aggs": {
"average_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
解释:
size: 0:不返回任何文档,仅返回聚合结果。by_category:桶聚合的名称,用于按类别分组。terms:按category.keyword字段的唯一值对文档进行分组。average_price:度量聚合的名称,用于计算每个类别的平均价格。avg:计算字段的平均值。field: "price":指定要计算平均值的字段。
结果:
{
"aggregations": {
"by_category": {
"buckets": [
{
"key": "Electronics",
"doc_count": 50,
"average_price": {
"value": 200.0
}
},
{
"key": "Books",
"doc_count": 30,
"average_price": {
"value": 15.0
}
},
{
"key": "Clothing",
"doc_count": 20,
"average_price": {
"value": 50.0
}
}
]
}
}
}
分析:
buckets:每个桶代表一个类别。key:类别名称。doc_count:该类别下的产品数量。average_price:该类别下的平均价格。
总结
- 统计聚合:用于计算单个字段的统计信息,如平均值、总和、最小值、最大值和标准差。
- 分组聚合:用于将数据分组到不同的桶中,根据字段的唯一值进行分组,并对每个组计算统计信息,如平均价格。
这两个聚合案例展示了如何利用 Elasticsearch 的聚合功能从数据中提取有用的信息和洞察,帮助用户进行数据分析和决策。