使用聚合分析结果

Elasticsearch 聚合能让你获取搜索结果的元信息,并回答这些问题,如“德克萨斯州有多少账户所有者?”或“田纳西州的账户平均余额是多少?”。你可以在一个请求中搜索文档、过滤命中以及使用聚合分析结果。

例如,以下的请求使用一个词语聚合分组在银行(bank)索引中按州对所有账户分组,并按降序返回账户最多的十个州:

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

响应中的桶(bucket)是州(state)字段的值。doc_count 显示每个州的账户数量。例如,你可以看到 ID(爱达荷州)有 27 个账户。由于这个请求设置 size=0,这个请求只包含聚合结果。

  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. }

你可以合并聚合来构建更复杂的数据摘要。例如,以下请求在前一个按州分组(group_by_state)聚合嵌套一个 avg 聚合,以计算每个州的平均账户余额。

  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. }

你可以使用嵌套聚合结果进行排序(通过指定词语聚合顺序),而不是按计数结果进行排序:

  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. }

除了这些基本的桶和度量聚合外,Elasticsearch 提供了特定的聚合用于操作多个字段和分析特定类型数据,如日期、IP 地址以及地理数据。你还可以将单个聚合的结果输入管道聚合用于进一步的分析。

聚合提供的核心分析能力支持高级特性,如使用机器学习来检测异常。

原文链接