对于指定的阈值,HLL 的数据结构会大概使用 precision_threshold * 8 字节的内存,所以就必须在牺牲内存和获得额外的准确度间做平衡。 在实际应用中, 100 的阈值可以在唯一值为百万的情况下仍然将误差维持 5% 以内。 五、collapse + cardinality 实现去重统计和查询 代码语言:javascript 代码运行次数:0 运行 AI代码解...
Elasticsearch从7.10版本开始引入了 cardinality 聚合的 precision_threshold 参数,当设置为较高的值时,可以提供更准确的基数统计。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html 配置方法: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 ...
Elasticsearch 5.4版本官方文档对cardinality的文档及其precision_threshold参数的研究:https://www.elastic....
对于指定的阈值,HLL 的数据结构会大概使用 precision_threshold * 8 字节的内存,所以就必须在牺牲内存和获得额外的准确度间做平衡。 在实际应用中, 100 的阈值可以在唯一值为百万的情况下仍然将误差维持 5% 以内。 五、collapse + cardinality 实现去重统计和查询 { "query": { "bool": { "filter": [ { "...
下面对 ES 的 cardinality 的 precision_threshold 参数进行了验证: 1、大数据量下,设置最高精度及其以上,仍然会存在误差: 2、小数据量下,设置最高精度,可以和实际数量保持一致: 那么线上的为什么聚合统计的是 21514,条件查询的是 21427? 从不加 precision_threshold 参数可以知道,这个应该是 ES 设置的默认值。
precision_threshold=10000, 10000 * 8 = 80000 个byte, 80000 / 1024 ≈ 80KB 3、HyperLogLog++ (HLL)算法性能优化 cardinality底层算法:HLL算法,HLL算法的性能 会对所有的uqniue value取hash值,通过hash值近似去求distcint count,误差 默认情况下,发送一个cardinality请求的时候,会动态地对所有的field value,取...
POST /index/_search { "size":0, "aggs": { "name_count": { "cardinality": { "field": "name", "precision_threshold": 100 } } } } 1 2 3 4 5 6 7 8 9 10 11 12 response: { "aggregations": { "name_count": { "value": 3 } } } 1 2 3 4 5 6 7 这里precision_thre...
"cardinality" : { "field" : "color", "precision_threshold" : 100 } } } } precision_threshold接受 0–40,000 之间的数字,更大的值还是会被当作 40,000 来处理。 示例会确保当字段唯一值在 100 以内时会得到非常准确的结果。尽管算法是无法保证这点的,但如果基数在阈值以下,几乎总是 100% 正确的。
cardinality 并不是像关系型数据库 MySQL 一样精确去重的,它是一个近似值,是 ES 帮你"估算"出的,这个估算使用的 HyperLogLog++ (HLL)算法,在速度上非常快,遍历一次即可统计去重,具体可看文档中推荐的论文。 ES 做估算,是可以设置估算精确度,即设置参数 precision_threshold 参数,但是这个参数在 0-40000, 这个值...
(大数据量下有准确性和性能问题):precision_threshold默认4000,4000以内可确保100%准确性13builder.withAggregations(AggregationBuilders.cardinality("total_spu").field("spu_id"));1415//排序(销量)16builder.withSorts(Collections.singleton(SortBuilders.fieldSort("sale_volume").order(SortOrder.DESC)));1718//...