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