当buckets数量特别多的时候,深度优先和广度优先的原理,图解
假如我们有如下数据数据:每个演员的每个电影的评论。
现在我们的需求是找到前10名的演员所演的电影的评论。这是一个两层聚合题。
查询语句体如下:
{
"aggs" : {
"actors" : {
"terms" : {
"field" : "actors",
"size" : 10,
"collect_mode" : "breadth_first"
},
"aggs" : {
"costars" : {
"terms" : {
"field" : "films",
"size" : 5
}
}
}
}
}
}
es默认采用广度优先原则:
这种方式下,先把所有演员所演的电影找出来一一对应,然后再选出前10名的演员,舍弃掉其他的演员的数据。假设有1000个演员,每个演员有10个电影,这是舍弃的就是990*10=9900个数据,而不是990个数据,而且在舍弃数据之前就已经把其余数据聚合好了,这也是一次无用的计算。
深度优先
深度优先和广度优先不同,他首先选出10个演员,在选出这10个演员之前,没有经过聚合,这时舍弃的数据只是990条,并且没有经过聚合,然后再在这10个演员中聚合。这样就可以大大的提升性能。
"collect_mode" : "breadth_first" 表示设置成深度优先。