mirror of
https://github.com/elastic/elasticsearch.git
synced 2025-04-25 15:47:23 -04:00
This replaces the `script` docs for bucket aggregations with runtime
fields. We expect runtime fields to be nicer to work with because you
can also fetch them or filter on them. We expect them to be faster
because their don't need this sort of `instanceof` tree:
a92a647b9f/server/src/main/java/org/elasticsearch/search/aggregations/support/values/ScriptDoubleValues.java (L42)
Relates to #69291
Co-authored-by: James Rodewig <40268737+jrodewig@users.noreply.github.com>
Co-authored-by: Adam Locke <adam.locke@elastic.co>
117 lines
2.9 KiB
Text
117 lines
2.9 KiB
Text
[[search-aggregations-metrics-stats-aggregation]]
|
|
=== Stats aggregation
|
|
++++
|
|
<titleabbrev>Stats</titleabbrev>
|
|
++++
|
|
|
|
A `multi-value` metrics aggregation that computes stats over numeric values extracted from the aggregated documents.
|
|
|
|
The stats that are returned consist of: `min`, `max`, `sum`, `count` and `avg`.
|
|
|
|
Assuming the data consists of documents representing exams grades (between 0 and 100) of students
|
|
|
|
[source,console]
|
|
--------------------------------------------------
|
|
POST /exams/_search?size=0
|
|
{
|
|
"aggs": {
|
|
"grades_stats": { "stats": { "field": "grade" } }
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
// TEST[setup:exams]
|
|
|
|
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:
|
|
|
|
|
|
[source,console-result]
|
|
--------------------------------------------------
|
|
{
|
|
...
|
|
|
|
"aggregations": {
|
|
"grades_stats": {
|
|
"count": 2,
|
|
"min": 50.0,
|
|
"max": 100.0,
|
|
"avg": 75.0,
|
|
"sum": 150.0
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
// TESTRESPONSE[s/\.\.\./"took": $body.took,"timed_out": false,"_shards": $body._shards,"hits": $body.hits,/]
|
|
|
|
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.
|
|
|
|
==== Script
|
|
|
|
If you need to get the `stats` for something more complex than a single field,
|
|
run the aggregation on a <<runtime,runtime field>>.
|
|
|
|
[source,console]
|
|
--------------------------------------------------
|
|
POST /exams/_search
|
|
{
|
|
"size": 0,
|
|
"runtime_mappings": {
|
|
"grade.weighted": {
|
|
"type": "double",
|
|
"script": """
|
|
emit(doc['grade'].value * doc['weight'].value)
|
|
"""
|
|
}
|
|
},
|
|
"aggs": {
|
|
"grades_stats": {
|
|
"stats": {
|
|
"field": "grade.weighted"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
// TEST[setup:exams]
|
|
// TEST[s/_search/_search?filter_path=aggregations/]
|
|
|
|
////
|
|
[source,console-result]
|
|
--------------------------------------------------
|
|
{
|
|
"aggregations": {
|
|
"grades_stats": {
|
|
"count": 2,
|
|
"min": 150.0,
|
|
"max": 200.0,
|
|
"avg": 175.0,
|
|
"sum": 350.0
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
////
|
|
|
|
|
|
==== Missing value
|
|
|
|
The `missing` parameter defines how documents that are missing a value should be treated.
|
|
By default they will be ignored but it is also possible to treat them as if they
|
|
had a value.
|
|
|
|
[source,console]
|
|
--------------------------------------------------
|
|
POST /exams/_search?size=0
|
|
{
|
|
"aggs": {
|
|
"grades_stats": {
|
|
"stats": {
|
|
"field": "grade",
|
|
"missing": 0 <1>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
// TEST[setup:exams]
|
|
|
|
<1> Documents without a value in the `grade` field will fall into the same bucket as documents that have the value `0`.
|