1、有些聚合分析的算法,是很容易就可以并行的,比如说max
有些聚合分析的算法,是不好并行的,比如说,count(distinct),并不是说,在每个node上,直接就出一些distinct value,就可以的,因为数据可能会很多
es会采取近似聚合的方式,就是采用在每个node上进行近估计的方式,得到最终的结论,cuont(distcint),可能会有5%左右的错误率,近似估计后的结果,不完全准确,但是速度会很快,一般会达到完全精准的算法的性能的数十倍。
2、三角选择原则
精准+实时+大数据 --> 选择2个
(1)精准+实时: 没有大数据,数据量很小,一般就是单机跑;
(2)精准+大数据:hadoop,批处理,非实时,可以处理海量数据,保证精准,可能会跑几个小时;
(3)大数据+实时:es,不精准,近似估计,可能会有百分之几的错误率;
3、近似聚合算法
如果采取近似估计的算法:延时在100ms左右,0.5%错误;
如果采取100%精准的算法:延时一般在5s~几十s,甚至几十分钟,几小时, 但是0%错误;
4、es中去重操作;
使用cartinality metric,对每个bucket中的指定的field进行去重,取去重后的count,类似于count(distcint)
GET /tvs/sales/_search
{
"size" : 0,
"aggs" : {
"months" : {
"date_histogram": {
"field": "sold_date",
"interval": "month"
},
"aggs": {
"distinct_colors" : {
"cardinality" : {
"field