Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Агрегирования ›Агрегирования по категориям

Агрегирование по фильтрам

Многокатегоричное агрегирование, где каждая категория содержит документы, соответствующие запросу.

Пример:

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API