如何解决 elasticsearch 在大量数据的情况下,使用 cardinality 去重,精度下降的问题

2023-08-10 15:59:08 +08:00
 AnyThingElae

数据量在 2000W 左右,使用 cardinality 去重,发现数据不准,和直接拿出所有数据去重的数量有不小的差距,大家是如何应对这种情况的?

GET _index12345/_search
{
  "size": 0,
  "aggs": {
    "t": {
      "cardinality": {
        "field": "id",
        "precision_threshold": 40000
      }
    }
  }
}
691 次点击
所在节点    问与答
8 条回复
Saturn72
2023-08-10 16:06:05 +08:00
ZYXDemo
2023-08-10 18:26:05 +08:00
忽略了,因为业务上不需要那么准。。。
zitionguo
2023-08-11 10:02:55 +08:00
通过桶数量获取去重后的总数量,不过桶数量好像有 65536 的限制,可以通过修改 settings - index.max_terms_count 来控制,慎改😂
{
"size": 0,
"aggregations": {
"xxx": {
"terms": {
"field": "uniqueKey",
"size": 65536
}
}
}
}
AnyThingElae
2023-08-11 10:46:22 +08:00
@zitionguo 我们现在就是用的这种方案,数据量小的月份还能挺住,数据量大起来就报错了。。
zitionguo
2023-08-11 13:51:14 +08:00
@AnyThingElae 哈哈,我之前也用的这个,超过这个数量只能增加查询条件(前端提示一下),其实体验不太好。
zitionguo
2023-08-11 14:16:10 +08:00
问了下 gpt ,不知到有没有用😂。
使用 HyperLogLog++ 数据结构:Elasticsearch 在近期的版本中引入了 HyperLogLog++ 数据结构,它在基数估计方面比传统的 HyperLogLog 算法更准确。可以使用 cardinality 聚合的 method 参数来指定使用 HyperLogLog++。
"aggs": {
"unique_count": {
"cardinality": {
"field": "your_field",
"method": "hll++"
}
}
}
AnyThingElae
2023-08-11 15:43:24 +08:00
@zitionguo 我试了下,得到[cardinality] unknown field [method],不知道是版本的问题,还是 gpt 胡诌的答案,我问了下 gpt 也是出了个其他的未知字段...
zitionguo
2023-08-11 17:09:53 +08:00
@AnyThingElae #7 官网也没翻到,确实是编的😵‍💫

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/964147

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX