【Elasticsearch】random_sampler聚合
随机采样聚合
此功能处于技术预览阶段,未来版本可能会有所更改或移除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。
`random_sampler`聚合是一种单桶聚合,它随机地将文档包含在聚合结果中。采样以牺牲准确性为代价显著提高了速度。
采样是通过提供分片中整个文档集合的一个随机子集来实现的。如果在搜索请求中提供了过滤查询,该过滤器将应用于采样子集。因此,如果过滤器限制性很强,可能只有很少的文档匹配,因此统计结果可能不够准确。
此聚合不应与采样聚合混淆。采样聚合并不是针对所有文档进行采样,而是对查询匹配到的前`n`个文档进行采样。
```http
GET kibana_sample_data_ecommerce/_search?size=0&track_total_hits=false
{
"aggregations": {
"sampling": {
"random_sampler": {
"probability": 0.1
},
"aggs": {
"price_percentiles": {
"percentiles": {
"field": "taxful_total_price"
}
}
}
}
}
}
```
`random_sampler`的顶级参数
`probability`
(必需,浮点数)文档被包含在聚合数据中的概率。必须大于 0,小于`0.5`,或者正好是`1`。概率越低,匹配的文档就越少。
`seed`
(可选,整数)用于生成文档随机采样的种子。当提供种子时,随机子集的文档在调用之间是相同的。
采样是如何工作的?
聚合是对索引中的所有文档进行随机采样。换句话说,采样是在背景文档集合上进行的。如果提供了查询,只有当文档匹配查询并且在随机采样中时,才会返回该文档。采样不是在匹配的文档上进行的。
考虑文档集合`[1, 2, 3, 4, 5]`。你的查询匹配`[1, 3, 5]`,而随机采样集合是`[2, 4, 5]`。在这种情况下,返回的文档将是`[5]`。
这种类型的采样在查询延迟方面几乎呈线性改进,与采样减少文档集合大小的幅度有关:
对于一个包含 6300 万文档的测试数据集,大多数聚合的加速效果如上图所示。确切的常数将取决于数据集大小和分片数量,但加速与概率之间的关系形式在广泛情况下都成立。对于某些聚合,加速效果可能没有那么显著。这些聚合有一些与看到的文档数量无关的固定开销。即使对于这些聚合,速度改进仍然可以是显著的。
样本集是通过使用几何分布(`(1-p)^(k-1)*p`)跳过文档生成的,其中成功概率是提供的`probability`(分布方程中的`p`)。从分布返回的值指示在背景中跳过的文档数量。这相当于均匀随机选择文档。由此可知,预期的失败次数(或平均跳过的文档数量)是`(1-p)/p`。例如,当`"probability": 0.01`时,预期的失败次数(或平均跳过的文档数量)为`99`,方差为`9900`。因此,如果你的索引中只有 80 个文档,或者匹配到的文档数量较少,你很可能收不到任何结果。
在上图中,`p`是提供给聚合的概率,`n`是由提供的查询匹配到的文档数量。你可以看到异常值对`sum`和`mean`的影响,但当在较高的采样率下仍然匹配到许多文档时,相对误差仍然很低。
这代表了针对一个典型的正偏态 APM 数据集进行聚合的结果,该数据集的上尾部也有异常值。相对误差对样本大小的线性依赖关系被广泛发现,但斜率取决于正在聚合的数量的变化。因此,你自己的数据中的变化可能导致相对误差率以不同的速率增加或减少。
随机采样一致性
对于给定的`probability`和`seed`,当从同一分片采样未更改的数据时,随机采样聚合是一致的。然而,这是背景随机采样,如果某个特定文档是否包含在采样集中,取决于当前的段数量。
这意味着,副本分片与主分片可能会返回不同的值,因为不同的特定文档被采样。
如果分片通过文档添加、更新、删除或段合并发生变化,采样的特定文档可能会改变,因此生成的统计结果也可能会改变。
随机采样聚合生成的统计结果是近似的,应被视为近似值。
随机采样的特殊情况
随机采样聚合返回的所有计数都会被缩放,以便于可视化和计算。例如,当对日期直方图聚合进行随机采样时,每个桶的每个`doc_count`值都会通过随机采样器的`probability`值的倒数进行缩放。因此,如果某个桶的`doc_count`为`10,000`,`probability`为`0.1`,那么实际聚合的文档数量为`1,000`。
唯一例外的是基数聚合。唯一项计数不适合自动缩放。在解释基数计数时,将其与随机采样聚合顶层的`doc_count`中提供的采样文档数量进行比较。它可以让你了解唯一值占总值的百分比。然而,它可能无法反映给定字段的确切唯一值数量。