Агрегация Top metrics
Агрегация top_metrics выбирает метрики из документа с наибольшим или наименьшим значением "сортировки". Например, это получает значение поля m в документе с наибольшим значением s:
POST /test/_bulk?refresh
{"index": {}}
{"s": 1, "m": 3.1415}
{"index": {}}
{"s": 2, "m": 1.0}
{"index": {}}
{"s": 3, "m": 2.71828}
POST /test/_search?filter_path=aggregations
{
"aggs": {
"tm": {
"top_metrics": {
"metrics": {"field": "m"},
"sort": {"s": "desc"}
}
}
}
} Что возвращает:
{
"aggregations": {
"tm": {
"top": [ {"sort": [3], "metrics": {"m": 2.718280076980591 } } ]
}
}
} Агрегация top_metrics довольно похожа по духу на top_hits, но из-за более ограниченных возможностей она способна выполнять свою работу с меньшим объёмом памяти и часто быстрее.
sort
Поле sort в запросе метрики работает точно так же, как поле sort в запросе поиска, за исключением:
- Оно не может быть использовано для полей бинарного, сглаженного, IP, ключевого или текстового типа.
- Оно поддерживает только одно значение сортировки, поэтому порядок при равенстве не определён.
Метрики, возвращаемые агрегацией, — это первая запись, которая была бы возвращена запросом поиска. Таким образом,
-
"sort": {"s": "desc"} - получает метрики из документа с наивысшим значением
s -
"sort": {"s": "asc"} - получает метрики из документа с наименьшим значением
s -
"sort": {"_geo_distance": {"location": "35.7796, -78.6382"}} - получает метрики из документов с
locationзначением, наиболее близким к35.7796, -78.6382 -
"sort": "_score" - получает метрики из документа с наивысшим рейтингом
metrics
metrics выбирает поля "топ" документа для возврата. Вы можете запросить одну метрику, например, "metrics": {"field": "m"}, или несколько метрик, запросив список метрик, как в "metrics": [{"field": "m"}, {"field": "i"}.
metrics.field поддерживает следующие типы полей:
За исключением ключевых слов, также поддерживаются временные поля для соответствующих типов. metrics.field не поддерживает поля с массивами значений. Агрегация top_metric по массивам значений может возвращать несогласованные результаты.
В следующем примере показано применение агрегации top_metrics к нескольким типам полей.
PUT /test
{
"mappings": {
"properties": {
"d": {"type": "date"}
}
}
}
POST /test/_bulk?refresh
{"index": {}}
{"s": 1, "m": 3.1415, "i": 1, "d": "2020-01-01T00:12:12Z", "t": "cat"}
{"index": {}}
{"s": 2, "m": 1.0, "i": 6, "d": "2020-01-02T00:12:12Z", "t": "dog"}
{"index": {}}
{"s": 3, "m": 2.71828, "i": -12, "d": "2019-12-31T00:12:12Z", "t": "chicken"}
POST /test/_search?filter_path=aggregations
{
"aggs": {
"tm": {
"top_metrics": {
"metrics": [
{"field": "m"},
{"field": "i"},
{"field": "d"},
{"field": "t.keyword"}
],
"sort": {"s": "desc"}
}
}
}
} Что возвращает:
{
"aggregations": {
"tm": {
"top": [ {
"sort": [3],
"metrics": {
"m": 2.718280076980591,
"i": -12,
"d": "2019-12-31T00:12:12.000Z",
"t.keyword": "chicken"
}
} ]
}
}
} size
top_metrics может вернуть метрики верхних нескольких документов, используя параметр size:
POST /test/_bulk?refresh
{"index": {}}
{"s": 1, "m": 3.1415}
{"index": {}}
{"s": 2, "m": 1.0}
{"index": {}}
{"s": 3, "m": 2.71828}
POST /test/_search?filter_path=aggregations
{
"aggs": {
"tm": {
"top_metrics": {
"metrics": {"field": "m"},
"sort": {"s": "desc"},
"size": 3
}
}
}
} Что возвращает:
{
"aggregations": {
"tm": {
"top": [
{"sort": [3], "metrics": {"m": 2.718280076980591 } },
{"sort": [2], "metrics": {"m": 1.0 } },
{"sort": [1], "metrics": {"m": 3.1414999961853027 } }
]
}
}
} По умолчанию size равно 1. Максимальное значение по умолчанию — 10, поскольку рабочая память агрегации "плотная", то есть мы выделяем size слотов для каждого ведра. 10 — это очень консервативное значение по умолчанию, и вы можете увеличить его, изменив настройку индекса top_metrics_max_size. Но помните, что большие значения могут потребовать значительного объёма памяти, особенно если они находятся внутри агрегации, которая создаёт много ведер, например, большая агрегация terms. Если вы всё-таки хотите увеличить его, используйте что-то вроде:
PUT /test/_settings
{
"top_metrics_max_size": 100
} Если size больше 1, агрегация top_metrics не может быть целью сортировки.
Примеры
Использование с terms
Эта агрегация должна быть весьма полезна внутри terms агрегации, чтобы, скажем, найти последнее значение, сообщённое каждым сервером.
PUT /node
{
"mappings": {
"properties": {
"ip": {"type": "ip"},
"date": {"type": "date"}
}
}
}
POST /node/_bulk?refresh
{"index": {}}
{"ip": "192.168.0.1", "date": "2020-01-01T01:01:01", "m": 1}
{"index": {}}
{"ip": "192.168.0.1", "date": "2020-01-01T02:01:01", "m": 2}
{"index": {}}
{"ip": "192.168.0.2", "date": "2020-01-01T02:01:01", "m": 3}
POST /node/_search?filter_path=aggregations
{
"aggs": {
"ip": {
"terms": {
"field": "ip"
},
"aggs": {
"tm": {
"top_metrics": {
"metrics": {"field": "m"},
"sort": {"date": "desc"}
}
}
}
}
}
} Что возвращает:
{
"aggregations": {
"ip": {
"buckets": [
{
"key": "192.168.0.1",
"doc_count": 2,
"tm": {
"top": [ {"sort": ["2020-01-01T02:01:01.000Z"], "metrics": {"m": 2 } } ]
}
},
{
"key": "192.168.0.2",
"doc_count": 1,
"tm": {
"top": [ {"sort": ["2020-01-01T02:01:01.000Z"], "metrics": {"m": 3 } } ]
}
}
],
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0
}
}
} В отличие от top_hits, вы можете сортировать ведра по результатам этой метрики:
POST /node/_search?filter_path=aggregations
{
"aggs": {
"ip": {
"terms": {
"field": "ip",
"order": {"tm.m": "desc"}
},
"aggs": {
"tm": {
"top_metrics": {
"metrics": {"field": "m"},
"sort": {"date": "desc"}
}
}
}
}
}
} Что возвращает:
{
"aggregations": {
"ip": {
"buckets": [
{
"key": "192.168.0.2",
"doc_count": 1,
"tm": {
"top": [ {"sort": ["2020-01-01T02:01:01.000Z"], "metrics": {"m": 3 } } ]
}
},
{
"key": "192.168.0.1",
"doc_count": 2,
"tm": {
"top": [ {"sort": ["2020-01-01T02:01:01.000Z"], "metrics": {"m": 2 } } ]
}
}
],
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0
}
}
} Смешанные типы сортировки
Сортировка top_metrics по полю, имеющему различные типы в разных индексах, приводит к несколько неожиданным результатам: поля с плавающей точкой всегда сортируются независимо от целых чисел.
POST /test/_bulk?refresh
{"index": {"_index": "test1"}}
{"s": 1, "m": 3.1415}
{"index": {"_index": "test1"}}
{"s": 2, "m": 1}
{"index": {"_index": "test2"}}
{"s": 3.1, "m": 2.71828}
POST /test*/_search?filter_path=aggregations
{
"aggs": {
"tm": {
"top_metrics": {
"metrics": {"field": "m"},
"sort": {"s": "asc"}
}
}
}
} Что возвращает:
{
"aggregations": {
"tm": {
"top": [ {"sort": [3.0999999046325684], "metrics": {"m": 2.718280076980591 } } ]
}
}
} Хотя это лучше, чем ошибка, это вероятно не то, чего вы ожидали. Хотя при этом теряется точность, вы можете явно преобразовать поля целых чисел в числа с плавающей точкой, например:
POST /test*/_search?filter_path=aggregations
{
"aggs": {
"tm": {
"top_metrics": {
"metrics": {"field": "m"},
"sort": {"s": {"order": "asc", "numeric_type": "double"}}
}
}
}
} Что возвращает гораздо более ожидаемое:
{
"aggregations": {
"tm": {
"top": [ {"sort": [1.0], "metrics": {"m": 3.1414999961853027 } } ]
}
}
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/search-aggregations-metrics-top-metrics.html