48_ElasticSearch ardinality算法之优化内存开销以及HLL算法

48_ElasticSearch ardinality算法之优化内存开销以及HLL算法

更多干货

一、概述

  • ardinality算法类似与count(distcint)。在多shard情况下有一定的误差
  • cardinality,count(distinct),5%的错误率,性能在100ms左右

二、precision_threshold优化准确率和内存开销

GET /tvs/sales/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_brand" : {
            "cardinality" : {
              "field" : "brand",
              "precision_threshold" : 100 
            }
        }
    }
}

例子:设置 precision_threshold 为100 者表示:

  • 对品牌brand去重,如果brand的unique value,在100个以内,小米,长虹,三星,TCL,HTL。几乎保证100%准确
  • precision_threshold 表示:在多少个unique value以内,cardinality,几乎保证100%准确
  • cardinality算法,会占用precision_threshold * 8 byte 内存消耗,100 * 8 = 800个字节
  • 占用内存很小。而且unique value如果的确在值以内,那么可以确保100%准确
  • 设置为100,如果有数百万的unique value,那么错误率也在5%以内
  • precision_threshold,值设置的越大,占用内存越大,1000 * 8 = 8000 / 1000 = 8KB,可以确保更多unique value的场景下,100%的准确

三、HyperLogLog++ (HLL)算法性能优化

  • cardinality底层算法:HLL算法,HLL算法的性能
  • 会对所有的uqniue value取hash值,通过hash值近似去求distcint count,误差
  • 默认情况下,发送一个cardinality请求的时候,会动态地对所有的field value,取hash值; 将取hash值的操作,前移到建立索引的时候
PUT /tvs/
{
  "mappings": {
    "sales": {
      "properties": {
        "brand": {
          "type": "text",
          "fields": {
            "hash": {
              "type": "murmur3" 
            }
          }
        }
      }
    }
  }
}

GET /tvs/sales/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_brand" : {
            "cardinality" : {
              "field" : "brand.hash",
              "precision_threshold" : 100 
            }
        }
    }
}

相关文章


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值