149 lines
3.9 KiB
Plaintext
149 lines
3.9 KiB
Plaintext
[[search-aggregations-metrics-max-aggregation]]
|
|
=== Max Aggregation
|
|
|
|
A `single-value` metrics aggregation that keeps track and returns the maximum
|
|
value among the numeric values extracted from the aggregated documents. These
|
|
values can be extracted either from specific numeric fields in the documents,
|
|
or be generated by a provided script.
|
|
|
|
NOTE: The `min` and `max` aggregation operate on the `double` representation of
|
|
the data. As a consequence, the result may be approximate when running on longs
|
|
whose absolute value is greater than +2^53+.
|
|
|
|
Computing the max price value across all documents
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
POST /sales/_search?size=0
|
|
{
|
|
"aggs" : {
|
|
"max_price" : { "max" : { "field" : "price" } }
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
// CONSOLE
|
|
// TEST[setup:sales]
|
|
|
|
Response:
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
{
|
|
...
|
|
"aggregations": {
|
|
"max_price": {
|
|
"value": 200.0
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
// TESTRESPONSE[s/\.\.\./"took": $body.took,"timed_out": false,"_shards": $body._shards,"hits": $body.hits,/]
|
|
|
|
As can be seen, the name of the aggregation (`max_price` above) also serves as
|
|
the key by which the aggregation result can be retrieved from the returned
|
|
response.
|
|
|
|
==== Script
|
|
|
|
The `max` aggregation can also calculate the maximum of a script. The example
|
|
below computes the maximum price:
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
POST /sales/_search
|
|
{
|
|
"aggs" : {
|
|
"max_price" : {
|
|
"max" : {
|
|
"script" : {
|
|
"inline" : "doc.price.value"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
// CONSOLE
|
|
// TEST[setup:sales]
|
|
|
|
This will use the <<modules-scripting-painless, Painless>> scripting language
|
|
and no script parameters. To use a file script use the following syntax:
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
POST /sales/_search
|
|
{
|
|
"aggs" : {
|
|
"max_price" : {
|
|
"max" : {
|
|
"script" : {
|
|
"file": "my_script",
|
|
"params": {
|
|
"field": "price"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
// CONSOLE
|
|
// TEST[setup:sales]
|
|
|
|
TIP: For indexed scripts replace the `file` parameter with an `id` parameter.
|
|
|
|
==== Value Script
|
|
|
|
Let's say that the prices of the documents in our index are in USD, but we
|
|
would like to compute the max in EURO (and for the sake of this example, let's
|
|
say the conversion rate is 1.2). We can use a value script to apply the
|
|
conversion rate to every value before it is aggregated:
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
POST /sales/_search
|
|
{
|
|
"aggs" : {
|
|
"max_price_in_euros" : {
|
|
"max" : {
|
|
"field" : "price",
|
|
"script" : {
|
|
"inline" : "_value * params.conversion_rate",
|
|
"params" : {
|
|
"conversion_rate" : 1.2
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
// CONSOLE
|
|
// TEST[setup:sales]
|
|
|
|
==== 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,js]
|
|
--------------------------------------------------
|
|
POST /sales/_search
|
|
{
|
|
"aggs" : {
|
|
"grade_max" : {
|
|
"max" : {
|
|
"field" : "grade",
|
|
"missing": 10 <1>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
--------------------------------------------------
|
|
// CONSOLE
|
|
// TEST[setup:sales]
|
|
|
|
<1> Documents without a value in the `grade` field will fall into the same
|
|
bucket as documents that have the value `10`.
|