聚合提供了从数据中分组和提取统计信息的功能。考虑聚合的最简单方法是将其大致等同于SQL GROUP BY和SQL聚合函数。在Elasticsearch中,您可以执行返回匹配的搜索,同时在一个响应中返回与命中相关的聚合结果。这是非常强大和高效的,因为您可以运行查询和多个聚合,并一次性获取两个(或任一)操作的结果,避免使用简洁和简化的API进行网络传输。

    首先,此示例按状态对所有帐户进行分组,然后返回按计数降序排序的前10个(默认)状态(也是默认值):

    1. GET /bank/_search
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "group_by_state": {
    6. "terms": {
    7. "field": "state.keyword"
    8. }
    9. }
    10. }
    11. }

    在SQL中,上述聚合在概念上类似于:

    1. SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC LIMIT 10;

    响应(部分显示):

    1. {
    2. "took": 29,
    3. "timed_out": false,
    4. "_shards": {
    5. "total": 5,
    6. "successful": 5,
    7. "skipped" : 0,
    8. "failed": 0
    9. },
    10. "hits" : {
    11. "total" : {
    12. "value": 1000,
    13. "relation": "eq"
    14. },
    15. "max_score" : null,
    16. "hits" : [ ]
    17. },
    18. "aggregations" : {
    19. "group_by_state" : {
    20. "doc_count_error_upper_bound": 20,
    21. "sum_other_doc_count": 770,
    22. "buckets" : [ {
    23. "key" : "ID",
    24. "doc_count" : 27
    25. }, {
    26. "key" : "TX",
    27. "doc_count" : 27
    28. }, {
    29. "key" : "AL",
    30. "doc_count" : 25
    31. }, {
    32. "key" : "MD",
    33. "doc_count" : 25
    34. }, {
    35. "key" : "TN",
    36. "doc_count" : 23
    37. }, {
    38. "key" : "MA",
    39. "doc_count" : 21
    40. }, {
    41. "key" : "NC",
    42. "doc_count" : 21
    43. }, {
    44. "key" : "ND",
    45. "doc_count" : 21
    46. }, {
    47. "key" : "ME",
    48. "doc_count" : 20
    49. }, {
    50. "key" : "MO",
    51. "doc_count" : 20
    52. } ]
    53. }
    54. }
    55. }

    我们可以看到ID(爱达荷州)有27个账户,其次是TX(德克萨斯州)的27个账户,其次是AL(阿拉巴马州)的25个账户,依此类推。

    在前一个聚合的基础上,此示例按州计算平均帐户余额(同样仅针对按降序排序的前10个州):

    1. GET /bank/_search
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "group_by_state": {
    6. "terms": {
    7. "field": "state.keyword"
    8. },
    9. "aggs": {
    10. "average_balance": {
    11. "avg": {
    12. "field": "balance"
    13. }
    14. }
    15. }
    16. }
    17. }
    18. }

    请注意我们如何嵌套group_by_state聚合中的average_balance聚合。这是所有聚合的常见模式。您可以在聚合中任意嵌套聚合,以从数据中提取所需的结果集。

    在前一个聚合的基础上,我们现在按降序排列平均余额:

    1. GET /bank/_search
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "group_by_state": {
    6. "terms": {
    7. "field": "state.keyword",
    8. "order": {
    9. "average_balance": "desc"
    10. }
    11. },
    12. "aggs": {
    13. "average_balance": {
    14. "avg": {
    15. "field": "balance"
    16. }
    17. }
    18. }
    19. }
    20. }
    21. }

    此示例演示了我们如何按年龄段(20-29岁,30-39岁和40-49岁)进行分组,然后按性别进行分组,最后得到每个年龄段的平均帐户余额:

    1. GET /bank/_search
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "group_by_age": {
    6. "range": {
    7. "field": "age",
    8. "ranges": [
    9. {
    10. "from": 20,
    11. "to": 30
    12. },
    13. {
    14. "from": 30,
    15. "to": 40
    16. },
    17. {
    18. "from": 40,
    19. "to": 50
    20. }
    21. ]
    22. },
    23. "aggs": {
    24. "group_by_gender": {
    25. "terms": {
    26. "field": "gender.keyword"
    27. },
    28. "aggs": {
    29. "average_balance": {
    30. "avg": {
    31. "field": "balance"
    32. }
    33. }
    34. }
    35. }
    36. }
    37. }
    38. }
    39. }

    还有许多其他聚合功能,我们在此不再详述。如果您想进行进一步的实验,聚合参考指南是一个很好的起点。