Elasticsearch cardinality存在误差

概述

cardinality 度量是一个近似算法。 它是基于 HyperLogLog++ (HLL)算法的。 HLL 会先对我们的输入作哈希运算,然后根据哈希运算的结果中的 bits 做概率估算从而得到基数。

优点:性能快,亿级别的记录在1秒内完成

            缺点:存在只能保证最大40000条记录内的精确,超过的存在5%的误差,不适合需要精确去重场景

1、示例:

GET /myindex/mytype/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_idCard" : {
            "cardinality" : {
              "field" : "idCard",
              "precision_threshold" : 100 
            }
        }
    }
}

上面代码是ES 按照idCard去重,统计结果count(distinct),这个统计结果会随你的数据条数发生变化,会存在误差。

如果你统计的数据有100万条,idCard 唯一计数大于100,想对这100万条中的用户身份进行去重。上面的结果会存在5%的误差。

如果你的数据只有100条数据,idCard 唯一计数小于100,那么这个统计结果准确率100%。

那么唯一计数在多少以内,这个准确率几乎能达到100%呢?

precision_threshold:接受 0–40000 之间的数字,更大的值还是会被当作 40000 来处理。

precision_threshold值设置的越大,占用内存越大。

对于指定的阈值,HLL 的数据结构会大概使用 precision_threshold * 8 字节的内存,所以就必须在牺牲内存和获得额外的准确度间做平衡。

比如你查询的结果有10000条数据,里面唯一计数为9800,你设置的precision_threshold =10000,你需要牺牲掉

10000 * 8 = 80000/1000=80KB的内存来取保结果准确率。

 

 

 

你可能感兴趣的:(Elasticsearch,cardinality)