聚合可以与搜索请求同时执行,但是我们需要理解一个新概念:范围 。 默认情况下,聚合与查询是对同一范围进行操作的,也就是说,聚合是基于我们查询匹配的文档集合进行计算的。


全局桶

通常我们希望聚合是在查询范围内的,但有时我们也想要搜索它的子集,而聚合的对象却是所有数据。
例如,比方说我们想知道福特汽车与所有汽车平均售价的比较。我们可以用普通的聚合(查询范围内的)得到第一个信息,然后用全局桶获得第二个信息。
全局 桶包含 所有 的文档,它无视查询的范围。因为它还是一个桶,我们可以像平常一样将聚合嵌套在内:

  1. GET /cars/transactions/_search
  2. {
  3. "size" : 0,
  4. "query" : {
  5. "match" : {
  6. "make" : "ford"
  7. }
  8. },
  9. "aggs" : {
  10. "single_avg_price": {
  11. "avg" : { "field" : "price" }
  12. },
  13. "all": {
  14. "global" : {},
  15. "aggs" : {
  16. "avg_price": {
  17. "avg" : { "field" : "price" }
  18. }
  19. }
  20. }
  21. }
  22. }