嵌套桶

在我们使用不同的嵌套方案时,聚合的力量才能真正得以显现。在前例中,我们已经看到如何将一个度量嵌入桶中,它的功能已经十分强大了。

但真正令人激动的分析来自于将桶嵌套进 另外一个桶 所能得到的结果。现在,我们想知道每个颜色的汽车制造商的分布:

  1. GET /cars/transactions/_search
  2. {
  3. "size" : 0,
  4. "aggs": {
  5. "colors": {
  6. "terms": {
  7. "field": "color"
  8. },
  9. "aggs": {
  10. "avg_price": { (1)
  11. "avg": {
  12. "field": "price"
  13. }
  14. },
  15. "make": { (2)
  16. "terms": {
  17. "field": "make" (3)
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }

<1> 注意前例中的 avg_price 度量仍然保持原位。

<2> 另一个聚合 make 被加入到了 color 颜色桶中。

<3> 这个聚合是 terms 桶,它会为每个汽车制造商生成唯一的桶。

这里发生了一些有趣的事。首先,我们可能会观察到之前例子中的 avg_price 度量完全没有变化,还在原来的位置。一个聚合的每个 层级 都可以有多个度量或桶, avg_price 度量告诉我们每种颜色汽车的平均价格。它与其他的桶和度量相互独立。

这对我们的应用非常重要,因为这里面有很多相互关联,但又完全不同的度量需要收集。聚合使我们能够用一次数据请求获得所有的这些信息。

另外一件值得注意的重要事情是我们新增的这个 make 聚合,它是一个 terms 桶(嵌套在 colorsterms 桶内)。这意味着它会为数据集中的每个唯一组合生成( colormake )元组。

让我们看看返回的响应(为了简单我们只显示部分结果):

  1. {
  2. ...
  3. "aggregations": {
  4. "colors": {
  5. "buckets": [
  6. {
  7. "key": "red",
  8. "doc_count": 4,
  9. "make": { (1)
  10. "buckets": [
  11. {
  12. "key": "honda", (2)
  13. "doc_count": 3
  14. },
  15. {
  16. "key": "bmw",
  17. "doc_count": 1
  18. }
  19. ]
  20. },
  21. "avg_price": {
  22. "value": 32500 (3)
  23. }
  24. },
  25. ...
  26. }

<1> 正如期望的那样,新的聚合嵌入在每个颜色桶中。

<2> 现在我们看见按不同制造商分解的每种颜色下车辆信息。

<3> 最终,我们看到前例中的 avg_price 度量仍然维持不变。

响应结果告诉我们以下几点:

  • 红色车有四辆。
  • 红色车的平均售价是 $32,500 美元。
  • 其中三辆是 Honda 本田制造,一辆是 BMW 宝马制造。