基数聚合
cardinality
聚合是一种单值指标聚合,用于计算字段的唯一或不同值的数量。
基数计数是近似值。有关更多信息,请参阅控制精度。
参数
cardinality
聚合接受以下参数。
参数 | 必需/可选 | 数据类型 | 描述 |
---|---|---|---|
field | 必需 | 字符串 | 用于估计基数的字段。 |
precision_threshold | 可选 | 数值 | 在此阈值以下,计数预计接近精确。有关更多信息,请参阅控制精度。 |
execution_hint | 可选 | 字符串 | 如何运行聚合。有效值为 ordinals 和 direct 。 |
missing | 可选 | 与 field 的类型相同 | 用于存储字段缺失实例的桶。如果未提供,则忽略缺失值。 |
示例
以下示例请求查找 OpenSearch Dashboards 示例电子商务数据中唯一产品 ID 的数量
GET opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"unique_products": {
"cardinality": {
"field": "products.product_id"
}
}
}
}
示例响应
如以下示例响应所示,聚合在 unique_products
变量中返回基数计数
{
"took": 176,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4675,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"unique_products": {
"value": 7033
}
}
}
控制精度
精确的基数计算需要将所有值加载到哈希集中并返回其大小。这种方法扩展性不好;它可能需要大量内存并导致高延迟。
您可以使用 precision_threshold
设置来控制内存和精度之间的权衡。此参数设置了计数预计接近精确的阈值。高于此值的计数可能不太精确。
precision_threshold
的默认值为 3,000。最大支持值为 40,000。
基数聚合使用 HyperLogLog++ 算法。基数计数在精度阈值以下通常非常精确,在大多数其他情况下,即使阈值低至 100,也与真实计数相差不超过 6%。
预计算哈希值
对于高基数字符串字段,存储索引字段的哈希值并计算哈希的基数可以节省计算和内存资源。请谨慎使用此方法;它仅对具有长字符串和/或高基数的集合更有效。数值字段和内存消耗较少的字符串集最好直接处理。
示例:控制精度
将精度阈值设置为 10000
个唯一值
GET opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"unique_products": {
"cardinality": {
"field": "products.product_id",
"precision_threshold": 10000
}
}
}
}
响应与默认阈值的结果相似,但返回的值略有不同。调整 precision_threshold
参数以查看其如何影响基数估计。
配置聚合执行
您可以使用 execution_hint
设置来控制聚合的运行方式。此设置支持两个选项
direct
– 直接使用字段值。ordinals
– 使用字段的序号。
如果您未指定 execution_hint
,OpenSearch 会自动为该字段选择最佳选项。
在非序号字段上设置 ordinals
无效。同样,direct
对序号字段也无效。
这是一项专家级设置。序号使用字节数组,其数组大小取决于字段的基数。高基数字段会消耗大量堆内存,增加内存不足错误的风险。
示例:控制执行
以下请求使用序号运行基数聚合
GET opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"unique_products": {
"cardinality": {
"field": "products.product_id",
"execution_hint": "ordinals"
}
}
}
}
缺失值
您可以为聚合字段的缺失实例指定一个值。有关更多信息,请参阅缺失聚合。
在基数聚合中替换缺失值会将替换值添加到唯一值列表中,从而将实际基数增加一。