当前位置:   article > 正文

Elasticsearch cardinality 精度问题_es cardinality

es cardinality

项目场景:

这里我项目使用的是Elasticsearch 7.x
应工作的需要,用到了Elasticsearch,而最近在项目开发上线前测试的时候发现了一个bug,
就是我有一个ES分页查询逻辑,通过页面查询出来的分页总数和数据库里面的总数对应不上,
首先ES是作为一张大宽表,录入每个人的基本信息+业务信息,所以ES中每个人的数据都会
产生很多条,我分页的时候是以人为维度进行查询,当时想到的就是借用ES提供的聚合查询
cardinality去重统计分页后的总数。

关于在项目中运用到的依赖以及不会的同学可以参考我上之前的文章

Springboot ElasticSearch依赖怎么选

Springboot中如何使用ElasticSearch

问题描述

我有一个ES分页查询逻辑,分页查询的时候需要根据用户的维度进行分组,
每组取最新一条展示,但是通过页面查询出来的分页总数和数据库里面的
总数对应不上。

原因分析:

因为第一次用ES,拿到问题的后觉得可能是自己代码写得有问题

但是DEV环境为啥就是好的,所以我想的第一步是先去检查代码,
经过查看,确实看不出代码有什么问题,所以我又debug了一遍,
因为是开发环境,没有发现问题。

这时候我就有点怀疑是ES的问题,所以我就利用kibana直接在生产上
,按照搜索条件统计了一遍输出结果,发现我的分页结果一摸一样,
然后同样的条件,有去数据库中统计了一遍,终于发现了问题,就是
ES cardinality 导致的精度问题

然后我就是官方查找文档,发现使用cardinality统计总数时,当你的数据
总量大于4w的时候就存在5%误差。说是底层使用HyperLogLog++ (HLL)算法,
亿级别的记录在1秒内完成统计,当然牺牲就是精确度了,对于不需要精确度的地
方还是可以用的。

解决方案:

接着我发现这精度时可以修改的,顿时喜出望外

precision_threshold // 接受 0–40000 之间的数字,更大的值还是会被当作 40000 来处理。
  • 1
GET /cars/transactions/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_colors" : {
            "cardinality" : {
              "field" : "color",
              "precision_threshold" : 100 
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

接着我将precision_threshold参数调到最大,发现还是问题,顿时想/(ㄒoㄒ)/~~

品着敬业

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/803510
推荐阅读
相关标签