# 海量 bucket 优化机制:从深度优先到广度优先
本章讲解当 buckets 数量特别多的时候,深度优先和广度优先的原理
场景定义,我们的数据:是每个演员的每个电影的评论
每个演员的评论的数量、每个演员的每个电影的评论的数量
评论数量排名前 10 个的演员、每个演员的电影取到评论数量排名前 5 的电影
{
"aggs" : {
"actors" : {
"terms" : {
"field" : "actors",
"size" : 10,
"collect_mode" : "breadth_first"
},
"aggs" : {
"costars" : {
"terms" : {
"field" : "films",
"size" : 5
}
}
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- collect_mode:默认是深度优先的方式去执行聚合操作的,可以修改为广度优先
对于深度和广度优先的解释,在这个场景中,你要记得数据是「是每个演员的每个电影的评论」。
深度优先
假设 100 个演员,只需要 10 个, 在这个场景中,会优先构建完成一颗树
actor1 actor2 .... actor film1 film2 film3 film1 film2 film3 ...film
1
2100 * 平均每个演员有 10 步骤电影 = 1000
广度优先
先不管电影,先构建 100 个演员的数据,截取前 10 个, 然后在 10 个中构建电影数据,最后只取 5 个电影数据 100 -> 10,10 & 10 = 100
从构建的数据量来看,广度优先胡更节约内存,1000/100=10 10 倍的差距