随机采样聚合

编辑

此功能处于技术预览阶段,可能会在未来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览版的功能不受官方 GA 功能的支持 SLA 约束。

random_sampler 聚合是一种单桶聚合,它随机地将文档包含在聚合结果中。采样以牺牲准确性为代价,提供了显著的速度提升。

采样是通过提供分片中整个文档集合的随机子集来完成的。如果在搜索请求中提供了过滤器查询,则该过滤器将应用于采样的子集。因此,如果过滤器具有限制性,则可能只有很少的文档匹配;因此,统计数据可能不那么准确。

此聚合不要与采样聚合混淆。采样聚合不是对所有文档进行,而是对查询匹配的前 n 个文档进行采样。

resp = client.search(
    index="kibana_sample_data_ecommerce",
    size="0",
    track_total_hits=False,
    aggregations={
        "sampling": {
            "random_sampler": {
                "probability": 0.1
            },
            "aggs": {
                "price_percentiles": {
                    "percentiles": {
                        "field": "taxful_total_price"
                    }
                }
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'kibana_sample_data_ecommerce',
  size: 0,
  track_total_hits: false,
  body: {
    aggregations: {
      sampling: {
        random_sampler: {
          probability: 0.1
        },
        aggregations: {
          price_percentiles: {
            percentiles: {
              field: 'taxful_total_price'
            }
          }
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "kibana_sample_data_ecommerce",
  size: 0,
  track_total_hits: "false",
  aggregations: {
    sampling: {
      random_sampler: {
        probability: 0.1,
      },
      aggs: {
        price_percentiles: {
          percentiles: {
            field: "taxful_total_price",
          },
        },
      },
    },
  },
});
console.log(response);
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]

这种类型的采样在查询延迟方面提供了几乎线性的改进,这与采样减少文档集的大小有关

Graph of the median speedup by sampling factor

此图是针对 6300 万个文档的测试数据集的大多数聚合加速的典型情况。确切的常量将取决于数据集的大小和分片的数量,但是加速与概率之间的关系形式广泛成立。对于某些聚合,加速可能不那么明显。这些聚合具有一些与所见文档数量无关的恒定开销。即使对于这些聚合,速度的提高也可能是显著的。

样本集是通过使用几何分布 ((1-p)^(k-1)*p) 跳过文档生成的,成功概率是提供的 probability(分布方程中的 p)。从分布返回的值指示在后台跳过多少个文档。这等效于均匀随机地选择文档。由此可见,成功前的预期失败次数为 (1-p)/p。例如,当 "probability": 0.01 时,预期失败次数(或跳过的文档平均数)将为 99,方差为 9900。因此,如果您的索引中只有 80 个文档或您的过滤器匹配 80 个文档,则很可能不会收到任何结果。

Graph of the relative error by sampling probability and doc count

在上图中,p 是提供给聚合的概率,n 是任何提供的查询匹配的文档数量。您可以看到离群值对 summean 的影响,但是当在较高的采样率下仍然匹配许多文档时,相对误差仍然很低。

这表示针对典型的正偏斜 APM 数据集(该数据集在上限尾部也有离群值)进行聚合的结果。发现相对误差对样本大小的线性依赖性广泛成立,但斜率取决于被聚合的数量的变化。因此,您自己数据中的方差可能会导致相对误差率以不同的速率增加或减少。

随机采样器一致性

编辑

对于给定的 probabilityseed,当从同一分片中采样未更改的数据时,随机采样器聚合是一致的。但是,这是后台随机采样,特定文档是否包含在采样集中取决于当前段的数量。

这意味着,副本分片与主分片可能会返回不同的值,因为会采样不同的特定文档。

如果通过添加、更新、删除或段合并更改了分片,则采样的特定文档可能会更改,从而导致生成的统计数据发生更改。

从随机采样器聚合使用的生成的统计数据是近似的,应该被这样对待。

随机采样特殊情况

编辑

随机采样器聚合返回的所有计数都经过缩放,以方便可视化和计算。例如,当随机采样日期直方图聚合时,每个桶的每个 doc_count 值都按 random_sampler probability 值的倒数进行缩放。因此,如果桶的 doc_count10,000,而 probability: 0.1,则聚合的实际文档数为 1,000

对此的一个例外是基数聚合。唯一项计数不适合自动缩放。在解释基数计数时,请将其与 random_sampler 聚合中顶层提供的 doc_count 中提供的采样文档数进行比较。它可以让您了解唯一值占总值的百分比。但是,它可能无法反映给定字段的唯一值的确切数量。