【Elasticsearch】Bucket Count K-S Test 聚合
Bucket Count K-S Test是 Elasticsearch 中的一种兄弟管道聚合(sibling pipeline aggregation),用于执行双样本柯尔莫哥洛夫-斯米尔诺夫检验(Kolmogorov-Smirnov Test,简称 K-S 检验)。这种聚合主要用于比较两个分布之间的差异,具体来说,是通过比较兄弟聚合中的文档计数分布与一个已知分布(如均匀分布或预定义的分布)来实现的。
工作原理
• 兄弟聚合:Bucket Count K-S Test 是一种兄弟管道聚合,这意味着它依赖于另一个聚合(如`range`聚合或`terms`聚合)的结果。兄弟聚合会生成一系列的桶(buckets),每个桶包含一组文档的计数。
• K-S 检验:K-S 检验是一种统计方法,用于比较两个分布是否来自同一总体。Bucket Count K-S Test 通过计算兄弟聚合生成的文档计数分布与预定义分布之间的差异来评估它们的相似性。
• 参数配置:
• `buckets_path`:指定兄弟聚合中包含文档计数的路径,通常是`range`聚合或`terms`聚合的`_count`。
• `alternative`:定义 K-S 检验的替代假设,可选值为`less`、`greater`或`two_sided`,默认为所有可能的替代假设。
• `fractions`:定义用于比较的分布,默认为均匀分布。
• `sampling_method`:指定抽样方法,可选值为`upper_tail`、`uniform`或`lower_tail`,默认为`upper_tail`。
使用场景
Bucket Count K-S Test 适用于以下场景:
• 性能分析:通过比较不同版本的软件或系统在延迟分布上的差异,评估性能改进。
• 质量控制:检测生产数据中是否存在异常分布,例如,通过比较实际数据与预期的均匀分布。
• 用户行为分析:分析用户行为数据在不同时间段或不同用户群体中的分布差异。
示例
以下是一个使用 Bucket Count K-S Test 的示例,假设我们有一个索引`correlate_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 },
{ "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 }
]
}
},
"ks_test": {
"bucket_count_ks_test": {
"buckets_path": "latency_ranges>_count",
"alternative": ["less", "greater", "two_sided"]
}
}
}
}
}
}
```
在这个示例中:
• 使用`terms`聚合按`version`字段分组。
• 使用`range`聚合将`latency`字段划分为多个范围。
• 使用`bucket_count_ks_test`聚合比较每个版本的延迟分布与均匀分布的差异。
输出结果
聚合结果将包含每个版本的延迟分布的 K-S 检验结果,包括`less`、`greater`和`two_sided`的 p 值。这些 p 值可以帮助我们判断延迟分布是否与预期分布显著不同。
通过这种聚合,用户可以快速识别出哪些版本的软件在延迟分布上存在显著差异,从而为进一步的性能分析或问题排查提供依据。