Terms聚合
{
"aggs" : {
"genders" : {
"terms" : { "field" : "gender" }
}
}
}
数据的不确定性
-
使用terms聚合,结果可能带有一定的偏差与错误性。
举个例子: 我们想要获取name字段中出现频率最高的前5个。
此时,客户端向ES发送聚合请求,主节点接收到请求后,会向每个独立的分片发送该请求。 分片独立的计算自己分片上的前5个name,然后返回。当所有的分片结果都返回后,在主节点进行结果的合并,再求出频率最高的前5个,返回给客户端。
这样就会造成一定的误差,比如最后返回的前5个中,有一个叫A的,有50个文档;B有49。 但是由于每个分片独立的保存信息,信息的分布也是不确定的。 有可能第一个分片中B的信息有2个,但是没有排到前5,所以没有在最后合并的结果中出现。 这就导致B的总数少计算了2,本来可能排到第一位,却排到了A的后面。
size与shard_size
- 为了改善上面的问题,就可以使用size和shard_size参数。
size参数规定了最后返回的term个数(默认是10个) shard_size参数规定了每个分片上返回的个数 如果shard_size小于size,那么分片也会按照size指定的个数计算 通过这两个参数,如果我们想要返回前5个,size=5;shard_size可以设置大于5,这样每个分片返回的词条信息就会增多,相应的误差几率也会减小。