一、简介

1、什么是ES聚合分析?

聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于 SQL GROUP BY 和 SQL 聚合函数。

聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值、最小值,计算和、平均值等。ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。

对一个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合 metric。

而关系型数据库中除了有聚合函数外,还可以对查询出的数据进行分组group by,再在组上进行指标聚合。在 ES 中group by 称为分桶,桶聚合 bucketing。

ES中还提供了矩阵聚合(matrix)、管道聚合(pipleline),但还在完善中。

2、ES聚合分析查询写法

在查询请求体中以 aggregations 节点按如下语法定义聚合分析:

  1. "aggregations" : {
  2. "<aggregation_name>" : {
  3. "<aggregation_type>" : {
  4. <aggregation_body>
  5. }
  6. [,"meta" : { [<meta_data_body>] } ]?
  7. [,"aggregations" : { [<sub_aggregation>]+ } ]?
  8. }
  9. [,"<aggregation_name_2>" : { ... } ]*
  10. }
  11. 说明:aggregations 也可简写为 aggs
  12. 3. 聚合分析的值来源#
  13. 聚合计算的值可以取字段的值,也可是脚本计算的结果。
  14. 二、指标聚合#
  15. 1. max min sum avg#
  16. 示例1:查询所有客户中余额的最大值
  17. POST /bank/_search?
  18. {
  19. "size": 0,
  20. "aggs": {
  21. "masssbalance": {
  22. "max": {
  23. "field": "balance"
  24. }
  25. }
  26. }
  27. }
  28. 结果1
  29. {
  30. "took": 2080,
  31. "timed_out": false,
  32. "_shards": {
  33. "total": 5,
  34. "successful": 5,
  35. "skipped": 0,
  36. "failed": 0
  37. },
  38. "hits": {
  39. "total": 1000,
  40. "max_score": 0,
  41. "hits": []
  42. },
  43. "aggregations": {
  44. "masssbalance": {
  45. "value": 49989
  46. }
  47. }
  48. }
  49. 示例2:值来源于脚本,查询所有客户的平均年龄是多少,并对平均年龄加10
  50. POST /bank/_search?size=0
  51. {
  52. "aggs": {
  53. "avg_age": {
  54. "avg": {
  55. "script": {
  56. "source": "doc.age.value"
  57. }
  58. }
  59. },
  60. "avg_age10": {
  61. "avg": {
  62. "script": {
  63. "source": "doc.age.value + 10"
  64. }
  65. }
  66. }
  67. }
  68. }
  69. 结果2
  70. {
  71. "took": 86,
  72. "timed_out": false,
  73. "_shards": {
  74. "total": 5,
  75. "successful": 5,
  76. "skipped": 0,
  77. "failed": 0
  78. },
  79. "hits": {
  80. "total": 1000,
  81. "max_score": 0,
  82. "hits": []
  83. },
  84. "aggregations": {
  85. "avg_age": {
  86. "value": 30.171
  87. },
  88. "avg_age10": {
  89. "value": 40.171
  90. }
  91. }
  92. }
  93. 三、桶聚合#
  94. file
  95. Terms Aggregation 根据字段值项分组聚合
  96. 示例1
  97. POST /bank/_search?size=0
  98. {
  99. "aggs": {
  100. "age_terms": {
  101. "terms": {
  102. "field": "age"
  103. }
  104. }
  105. }
  106. }
  107. 结果:
  108. {
  109. "took": 2000,
  110. "timed_out": false,
  111. "_shards": {
  112. "total": 5,
  113. "successful": 5,
  114. "skipped": 0,
  115. "failed": 0
  116. },
  117. "hits": {
  118. "total": 1000,
  119. "max_score": 0,
  120. "hits": []
  121. },
  122. "aggregations": {
  123. "age_terms": {
  124. "doc_count_error_upper_bound": 0,
  125. "sum_other_doc_count": 463,
  126. "buckets": [
  127. {
  128. "key": 31,
  129. "doc_count": 61
  130. },
  131. {
  132. "key": 39,
  133. "doc_count": 60
  134. },
  135. {
  136. "key": 26,
  137. "doc_count": 59
  138. },
  139. {
  140. "key": 32,
  141. "doc_count": 52
  142. },
  143. {
  144. "key": 35,
  145. "doc_count": 52
  146. },
  147. {
  148. "key": 36,
  149. "doc_count": 52
  150. },
  151. {
  152. "key": 22,
  153. "doc_count": 51
  154. },
  155. {
  156. "key": 28,
  157. "doc_count": 51
  158. },
  159. {
  160. "key": 33,
  161. "doc_count": 50
  162. },
  163. {
  164. "key": 34,
  165. "doc_count": 49
  166. }
  167. ]
  168. }
  169. }
  170. }