cardinality呈枉,count(distinct)哲泊,5%的錯誤率,性能在100ms左右
1舷夺、precision_threshold優(yōu)化準確率和內存開銷
GET /tvs/sales/_search
{
"size" : 0,
"aggs" : {
"distinct_brand" : {
"cardinality" : {
"field" : "brand",
"precision_threshold" : 100
}
}
}
}
brand去重苦酱,如果brand的unique value,在100個以內冕房,小米躏啰,長虹趁矾,三星耙册,TCL,HTL毫捣。详拙。。
在多少個unique value以內蔓同,cardinality饶辙,幾乎保證100%準確
cardinality算法,會占用precision_threshold * 8 byte 內存消耗斑粱,100 * 8 = 800個字節(jié)
占用內存很小弃揽。。。而且unique value如果的確在值以內矿微,那么可以確保100%準確
100痕慢,數(shù)百萬的unique value,錯誤率在5%以內
precision_threshold涌矢,值設置的越大掖举,占用內存越大,1000 * 8 = 8000 / 1000 = 8KB娜庇,可以確保更多unique value的場景下塔次,100%的準確
field,去重名秀,count励负,這時候,unique value匕得,10000熄守,precision_threshold=10000,10000 * 8 = 80000個byte耗跛,80KB
2裕照、HyperLogLog++ (HLL)算法性能優(yōu)化
cardinality底層算法:HLL算法,HLL算法的性能
會對所有的uqniue value取hash值调塌,通過hash值近似去求distcint count晋南,誤差
默認情況下,發(fā)送一個cardinality請求的時候羔砾,會動態(tài)地對所有的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
}
}
}
}