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的内存来取保结果准确率。

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值