数据量在 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 参数来指定使用 HyperLogLog++。 "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 官网也没翻到,确实是编的😵💫
|