Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›REST API ›Rollup API

Поиск в агрегированных данных

Позволяет искать данные, агрегированные с помощью стандартного Query DSL.

Данная функциональность находится в техническом предварительном просмотре и может быть изменена или удалена в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции в техническом предварительном просмотре не подпадают под SLA поддержки официальных функций GA.

Запрос

GET <target>/_rollup_search

Описание

Конечная точка поиска в агрегированных данных необходима потому, что внутренне агрегированные документы используют другую структуру, чем исходные данные. Конечная точка поиска в агрегированных данных преобразует стандартный Query DSL в формат, соответствующий агрегированным документам, а затем преобразует ответ обратно в формат, ожидаемый клиентом на основе исходного запроса.

Параметры пути

<target>

(Обязательно, строка) Список потоков данных и индексов, разделенных запятыми, для ограничения запроса. Поддерживаются шаблоны (*).

В этот список могут входить как индексы, используемые для агрегации, так и исходные индексы.

Правила для параметра <target>:

  • Должен быть указан хотя бы один поток данных, индекс или шаблон. В этот список могут входить как агрегированные, так и исходные индексы. Для потоков данных, подлежащие индексы могут использоваться только как исходные индексы. Невозможно опустить параметр <target> или использовать _all.
  • Можно указать несколько исходных индексов.
  • Можно указать только один агрегированный индекс. Если указано более одного, произойдёт исключение.
  • Можно использовать шаблоны, но если они соответствуют более чем одному агрегированному индексу, произойдёт исключение. Однако можно использовать шаблон для соответствия нескольким исходным индексам или потокам данных.

Тело запроса

Тело запроса поддерживает подмножество функций из API поиска. Он поддерживает:

  • Параметр query для указания запроса DSL, при соблюдении некоторых ограничений (см. ограничения для поиска в агрегированных данных и ограничения для агрегаций в агрегированных данных
  • Параметр aggregations для указания агрегаций

Функциональность, которая недоступна:

  • size: Поскольку агрегирование работает с предварительно агрегированными данными, результаты поиска не возвращаются, поэтому значение size должно быть установлено в ноль или вообще опущено.
  • highlighter, suggestors, post_filter, profile, explain: Аналогично, они запрещены.

Примеры

Пример поиска только по историческим данным

Предположим, у нас есть индекс с именем sensor-1, содержащий исходные данные, и мы создали задание агрегации со следующим конфигурацией:

PUT _rollup/job/sensor
{
  "index_pattern": "sensor-*",
  "rollup_index": "sensor_rollup",
  "cron": "*/30 * * * * ?",
  "page_size": 1000,
  "groups": {
    "date_histogram": {
      "field": "timestamp",
      "fixed_interval": "1h",
      "delay": "7d"
    },
    "terms": {
      "fields": [ "node" ]
    }
  },
  "metrics": [
    {
      "field": "temperature",
      "metrics": [ "min", "max", "sum" ]
    },
    {
      "field": "voltage",
      "metrics": [ "avg" ]
    }
  ]
}

Это агрегирует данные по шаблону sensor-* и сохраняет результаты в sensor_rollup. Для поиска в этих данных нужно использовать конечную точку _rollup_search. Однако вы заметите, что для поиска в агрегированных данных можно использовать стандартный Query DSL:

GET /sensor_rollup/_rollup_search
{
  "size": 0,
  "aggregations": {
    "max_temperature": {
      "max": {
        "field": "temperature"
      }
    }
  }
}

Запрос направлен на данные sensor_rollup, поскольку они содержат агрегированные данные, как настроено в задании. Была использована агрегация max по полю temperature, что привело к следующему ответу:

{
  "took" : 102,
  "timed_out" : false,
  "terminated_early" : false,
  "_shards" : ... ,
  "hits" : {
    "total" : {
        "value": 0,
        "relation": "eq"
    },
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "max_temperature" : {
      "value" : 202.0
    }
  }
}

Ответ точно такой же, как и при обычном запросе + агрегации; он предоставляет метаданные о запросе (took, _shards и т. д.), результаты поиска (которые всегда пустые для поиска в агрегированных данных) и ответ агрегации.

Поиск в агрегированных данных ограничен функциональностью, настроенной в задании агрегации. Например, мы не можем рассчитать среднюю температуру, потому что avg не был одним из настроенных метрик для поля temperature. Если мы попробуем выполнить этот поиск:

GET sensor_rollup/_rollup_search
{
  "size": 0,
  "aggregations": {
    "avg_temperature": {
      "avg": {
        "field": "temperature"
      }
    }
  }
}
{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "There is not a rollup job that has a [avg] agg with name [avg_temperature] which also satisfies all requirements of query.",
        "stack_trace": ...
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "There is not a rollup job that has a [avg] agg with name [avg_temperature] which also satisfies all requirements of query.",
    "stack_trace": ...
  },
  "status": 400
}

Поиск в агрегированных и исходных данных

API поиска в агрегированных данных позволяет искать как в «живых» исходных данных, так и в агрегированных данных. Это делается путем добавления исходных индексов в URI:

GET sensor-1,sensor_rollup/_rollup_search 
{
  "size": 0,
  "aggregations": {
    "max_temperature": {
      "max": {
        "field": "temperature"
      }
    }
  }
}

Обратите внимание, что URI теперь ищет в sensor-1 и sensor_rollup одновременно

При выполнении поиска конечная точка поиска в агрегированных данных делает два действия:

  1. Исходный запрос отправляется в исходный индекс без изменений.
  2. Переписанная версия исходного запроса отправляется в агрегированный индекс.

После получения двух ответов конечная точка переписывает ответ из агрегированных данных и объединяет их. Во время объединения, если существуют пересечения в группах между двумя ответами, используются группы из исходного индекса.

Ответ на вышеуказанный запрос выглядит так, как ожидалось, несмотря на охват агрегированных и исходных индексов:

{
  "took" : 102,
  "timed_out" : false,
  "terminated_early" : false,
  "_shards" : ... ,
  "hits" : {
    "total" : {
        "value": 0,
        "relation": "eq"
    },
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "max_temperature" : {
      "value" : 202.0
    }
  }
}

© 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/rollup-search.html

Spec-Zone.ru

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