Elasticsearch中的Bucket Correlation Aggregation(桶相关性聚合)是一种用于分析数据集中不同桶(Bucket)之间相关性的高级聚合功能。它属于兄弟管道聚合(Sibling Pipeline Aggregation),通过在配置的兄弟多桶聚合上执行相关性函数来实现。
核心概念
• 兄弟管道聚合:桶相关性聚合依赖于其他聚合(如`terms`、`range`等)生成的桶数据,然后在这些桶数据上进行相关性分析。
• 相关性分析:用于衡量两个或多个数据集之间的关系强度。例如,可以分析某个字段的不同值(如版本号)与另一个度量(如延迟)之间的相关性。
主要参数
• `buckets_path`:指定包含要相关值的桶的路径。它必须指向一个`_count`度量。
• `function`:定义要执行的相关性函数,目前支持`count_correlation`,用于计算计数相关性。
• `indicator`:定义与桶值相关联的指标,包含以下属性:
• `doc_count`:最初创建`expectations`的文档总数,必须大于或等于`buckets_path`中所有值的总和。
• `expectations`:与桶值相关联的数字数组,其长度必须等于`buckets_path`返回的桶的数量。
• `fractions`(可选):在计算平均值和方差时使用的分数数组,用于处理预计算数据和`buckets_path`之间的已知差距。
使用场景
假设有一个日志数据集,其中包含不同版本的软件(`version`字段)和每个版本的延迟(`latency`字段)。我们希望分析不同版本的软件与延迟之间的相关性,以确定是否存在某个版本导致延迟增加。
示例
以下是一个具体的示例,展示如何使用桶相关性聚合来分析`version`字段与`latency`字段之间的相关性:
查询示例
```json
POST correlate_latency/_search?size=0&filter_path=aggregations
{
"aggs": {
"buckets": {
"terms": {
"field": "version",
"size": 2
},
"aggs": {
"latency_ranges": {
"range": {
"field": "latency",
"ranges": [
{ "to": 0.0 },
{ "from": 0, "to": 105 },
{ "from": 105, "to": 225 },
{ "from": 225, "to": 445 },
{ "from": 445, "to": 665 },
{ "from": 665, "to": 885 },
{ "from": 885, "to": 1115 },
{ "from": 1115, "to": 1335 },
{ "from": 1335, "to": 1555 },
{ "from": 1555, "to": 1775 },
{ "from": 1775 }
]
}
},
"bucket_correlation": {
"bucket_correlation": {
"buckets_path": "latency_ranges>_count",
"function": {
"count_correlation": {
"indicator": {
"expectations": [0, 52.5, 165, 335, 555, 775, 1000, 1225, 1445, 1665, 1775],
"doc_count": 200
}
}
}
}
}
}
}
}
}
```
响应示例
```json
{
"aggregations" : {
"buckets" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "1.0",
"doc_count" : 100,
"latency_ranges" : {
"buckets" : [
{ "key" : "*-0.0", "to" : 0.0, "doc_count" : 0 },
{ "key" : "0.0-105.0", "from" : 0.0, "to" : 105.0, "doc_count" : 1 },
{ "key" : "105.0-225.0", "from" : 105.0, "to" : 225.0, "doc_count" : 9 },
{ "key" : "225.0-445.0", "from" : 225.0, "to" : 445.0, "doc_count" : 0 },
{ "key" : "445.0-665.0", "from" : 445.0, "to" : 665.0, "doc_count" : 0 },
{ "key" : "665.0-885.0", "from" : 665.0, "to" : 885.0, "doc_count" : 0 },
{ "key" : "885.0-1115.0", "from" : 885.0, "to" : 1115.0, "doc_count" : 10 },
{ "key" : "1115.0-1335.0", "from" : 1115.0, "to" : 1335.0, "doc_count" : 20 },
{ "key" : "1335.0-1555.0", "from" : 1335.0, "to" : 1555.0, "doc_count" : 20 },
{ "key" : "1555.0-1775.0", "from" : 1555.0, "to" : 1775.0, "doc_count" : 20 },
{ "key" : "1775.0-*", "from" : 1775.0, "doc_count" : 20 }
]
},
"bucket_correlation" : {
"value" : 0.8402398981360937
}
},
{
"key" : "2.0",
"doc_count" : 100,
"latency_ranges" : {
"buckets" : [
{ "key" : "*-0.0", "to" : 0.0, "doc_count" : 0 },
{ "key" : "0.0-105.0", "from" : 0.0, "to" : 105.0, "doc_count" : 19 },
{ "key" : "105.0-225.0", "from" : 105.0, "to" : 225.0, "doc_count" : 11 },
{ "key" : "225.0-445.0", "from" : 225.0, "to" : 445.0, "doc_count" : 20 },
{ "key" : "445.0-665.0", "from" : 445.0, "to" : 665.0, "doc_count" : 20 },
{ "key" : "665.0-885.0", "from" : 665.0, "to" : 885.0, "doc_count" : 20 },
{ "key" : "885.0-1115.0", "from" : 885.0, "to" : 1115.0, "doc_count" : 10 },
{ "key" : "1115.0-1335.0", "from" : 1115.0, "to" : 1335.0, "doc_count" : 0 },
{ "key" : "1335.0-1555.0", "from" : 1335.0, "to" : 1555.0, "doc_count" : 0 },
{ "key" : "1555.0-1775.0", "from" : 1555.0, "to" : 1775.0, "doc_count" : 0 },
{ "key" : "1775.0-*", "from" : 1775.0, "doc_count" : 0 }
]
},
"bucket_correlation" : {
"value" : -0.5759855613334943
}
}
]
}
}
}
```
响应解析
• `buckets`
包含了按`version`字段分组的术语桶(`terms`聚合的结果)。每个术语桶代表一个版本(如`1.0`和`2.0`)。
• `latency_ranges`
每个术语桶中包含一个范围聚合(`range`聚合),用于将`latency`字段的值划分为多个范围。每个范围的`doc_count`表示该范围内文档的数量。
• `bucket_correlation`
每个术语桶中还包含一个桶相关性聚合的结果。`value`字段表示该版本的延迟与预定义的期望值(`expectations`)之间的相关性系数。
示例解析
在上述响应中:
• 版本`1.0`
• 在`latency_ranges`中,延迟分布在不同范围内的文档数量如下:
• `0.0-105.0`:1个文档
• `105.0-225.0`:9个文档
• `885.0-1115.0`:10个文档
• `1115.0-1335.0`:20个文档
• 其他范围的文档数量为0。
• 相关性系数:`0.8402398981360937`,表示该版本的延迟分布与期望值之间存在较强的正相关性。
• 版本`2.0`
• 在`latency_ranges`中,延迟分布在不同范围内的文档数量如下:
• `0.0-105.0`:19个文档
• `105.0-225.0`:11个文档
• `225.0-445.0`:20个文档
• `445.0-665.0`:20个文档
• 其他范围的文档数量为0。
• 相关性系数:`-0.5759855613334943`,表示该版本的延迟分布与期望值之间存在较强的负相关性。
桶相关性聚合的作用
通过桶相关性聚合,可以快速识别出某些版本的软件是否与特定的延迟范围相关联。例如:
• 如果某个版本的延迟分布与期望值高度正相关,可能意味着该版本的软件在某些情况下表现良好。
• 如果某个版本的延迟分布与期望值高度负相关,可能意味着该版本的软件存在性能问题。
这种分析对于性能监控、故障排查和版本优化非常有用。
注意事项
1. 数据预处理
在使用桶相关性聚合之前,需要预先计算`expectations`值。这些值通常是基于历史数据或已知的性能指标计算得出的。
2. 数据量要求
`doc_count`必须大于或等于`buckets_path`中所有值的总和,以确保相关性计算的准确性。
3. 性能影响
桶相关性聚合可能会对查询性能产生一定影响,尤其是在数据量较大时。建议在生产环境中谨慎使用,并根据实际需求优化查询。
通过合理使用桶相关性聚合,可以深入分析数据之间的关系,为数据驱动的决策提供有力支持。