stats-aggregation.asciidoc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. [[search-aggregations-metrics-stats-aggregation]]
  2. === Stats aggregation
  3. ++++
  4. <titleabbrev>Stats</titleabbrev>
  5. ++++
  6. A `multi-value` metrics aggregation that computes stats over numeric values extracted from the aggregated documents.
  7. The stats that are returned consist of: `min`, `max`, `sum`, `count` and `avg`.
  8. Assuming the data consists of documents representing exams grades (between 0 and 100) of students
  9. [source,console]
  10. --------------------------------------------------
  11. POST /exams/_search?size=0
  12. {
  13. "aggs": {
  14. "grades_stats": { "stats": { "field": "grade" } }
  15. }
  16. }
  17. --------------------------------------------------
  18. // TEST[setup:exams]
  19. The above aggregation computes the grades statistics over all documents. The aggregation type is `stats` and the `field` setting defines the numeric field of the documents the stats will be computed on. The above will return the following:
  20. [source,console-result]
  21. --------------------------------------------------
  22. {
  23. ...
  24. "aggregations": {
  25. "grades_stats": {
  26. "count": 2,
  27. "min": 50.0,
  28. "max": 100.0,
  29. "avg": 75.0,
  30. "sum": 150.0
  31. }
  32. }
  33. }
  34. --------------------------------------------------
  35. // TESTRESPONSE[s/\.\.\./"took": $body.took,"timed_out": false,"_shards": $body._shards,"hits": $body.hits,/]
  36. The name of the aggregation (`grades_stats` above) also serves as the key by which the aggregation result can be retrieved from the returned response.
  37. ==== Script
  38. If you need to get the `stats` for something more complex than a single field,
  39. run the aggregation on a <<runtime,runtime field>>.
  40. [source,console]
  41. --------------------------------------------------
  42. POST /exams/_search
  43. {
  44. "size": 0,
  45. "runtime_mappings": {
  46. "grade.weighted": {
  47. "type": "double",
  48. "script": """
  49. emit(doc['grade'].value * doc['weight'].value)
  50. """
  51. }
  52. },
  53. "aggs": {
  54. "grades_stats": {
  55. "stats": {
  56. "field": "grade.weighted"
  57. }
  58. }
  59. }
  60. }
  61. --------------------------------------------------
  62. // TEST[setup:exams]
  63. // TEST[s/_search/_search?filter_path=aggregations/]
  64. ////
  65. [source,console-result]
  66. --------------------------------------------------
  67. {
  68. "aggregations": {
  69. "grades_stats": {
  70. "count": 2,
  71. "min": 150.0,
  72. "max": 200.0,
  73. "avg": 175.0,
  74. "sum": 350.0
  75. }
  76. }
  77. }
  78. --------------------------------------------------
  79. ////
  80. ==== Missing value
  81. The `missing` parameter defines how documents that are missing a value should be treated.
  82. By default they will be ignored but it is also possible to treat them as if they
  83. had a value.
  84. [source,console]
  85. --------------------------------------------------
  86. POST /exams/_search?size=0
  87. {
  88. "aggs": {
  89. "grades_stats": {
  90. "stats": {
  91. "field": "grade",
  92. "missing": 0 <1>
  93. }
  94. }
  95. }
  96. }
  97. --------------------------------------------------
  98. // TEST[setup:exams]
  99. <1> Documents without a value in the `grade` field will fall into the same bucket as documents that have the value `0`.