Агрегирование по фильтрам
Многокатегоричное агрегирование, где каждая категория содержит документы, соответствующие запросу.
Пример:
PUT /logs/_bulk?refresh
{ "index" : { "_id" : 1 } }
{ "body" : "warning: page could not be rendered" }
{ "index" : { "_id" : 2 } }
{ "body" : "authentication error" }
{ "index" : { "_id" : 3 } }
{ "body" : "warning: connection timed out" }
GET logs/_search
{
"size": 0,
"aggs" : {
"messages" : {
"filters" : {
"filters" : {
"errors" : { "match" : { "body" : "error" }},
"warnings" : { "match" : { "body" : "warning" }}
}
}
}
}
} В приведенном примере мы анализируем сообщения журналов. Агрегирование создаст две коллекции (категории) сообщений журналов — одну для всех сообщений с ошибкой и другую для всех сообщений с предупреждением.
Ответ:
{
"took": 9,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"messages": {
"buckets": {
"errors": {
"doc_count": 1
},
"warnings": {
"doc_count": 2
}
}
}
}
} Анонимные фильтры
Поле filters также может быть предоставлено в виде массива фильтров, как в следующем запросе:
GET logs/_search
{
"size": 0,
"aggs" : {
"messages" : {
"filters" : {
"filters" : [
{ "match" : { "body" : "error" }},
{ "match" : { "body" : "warning" }}
]
}
}
}
} Отфильтрованные категории возвращаются в том же порядке, что и в запросе. Ответ для этого примера будет:
{
"took": 4,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"messages": {
"buckets": [
{
"doc_count": 1
},
{
"doc_count": 2
}
]
}
}
}
Other Категория
Параметр other_bucket может быть установлен для добавления в ответ категории, содержащей все документы, не соответствующие ни одному из заданных фильтров. Значение этого параметра может быть следующим:
-
false - Не вычисляет категорию
other -
true - Возвращает категорию
other, либо в отдельной категории (с именем_other_по умолчанию), если используются именованные фильтры, либо как последнюю категорию, если используются анонимные фильтры
Параметр other_bucket_key может быть использован для задания ключа для категории other, отличного от значения по умолчанию _other_. Установка этого параметра неявно установит параметр other_bucket в true.
Следующий фрагмент кода показывает ответ, где категория other запрошена с именем other_messages.
PUT logs/_doc/4?refresh
{
"body": "info: user Bob logged out"
}
GET logs/_search
{
"size": 0,
"aggs" : {
"messages" : {
"filters" : {
"other_bucket_key": "other_messages",
"filters" : {
"errors" : { "match" : { "body" : "error" }},
"warnings" : { "match" : { "body" : "warning" }}
}
}
}
}
} Ответ будет примерно таким:
{
"took": 3,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"messages": {
"buckets": {
"errors": {
"doc_count": 1
},
"warnings": {
"doc_count": 2
},
"other_messages": {
"doc_count": 1
}
}
}
}
}
© 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-bucket-filters-aggregation.html