# 海量 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
  • collect_mode:默认是深度优先的方式去执行聚合操作的,可以修改为广度优先

对于深度和广度优先的解释,在这个场景中,你要记得数据是「是每个演员的每个电影的评论」。

  • 深度优先

    假设 100 个演员,只需要 10 个, 在这个场景中,会优先构建完成一颗树

    actor1            actor2            .... actor
    film1 film2 film3   film1 film2 film3   ...film
    
    1
    2

    100 * 平均每个演员有 10 步骤电影 = 1000

  • 广度优先

    先不管电影,先构建 100 个演员的数据,截取前 10 个, 然后在 10 个中构建电影数据,最后只取 5 个电影数据 100 -> 10,10 & 10 = 100

从构建的数据量来看,广度优先胡更节约内存,1000/100=10 10 倍的差距