Поиск по сворачиваемым данным
Устарело в версии 8.11.0.
Сворачивание будет удалено в будущей версии. Используйте downsampling вместо этого.
Позволяет искать данные, сгруппированные с помощью стандартного запроса Query DSL.
Запрос
GET <target>/_rollup_search
Описание
Конечная точка поиска по сворачиваемым данным необходима, так как внутренне сгруппированные документы используют другую структуру, отличную от исходных данных. Конечная точка поиска по сворачиваемым данным преобразует стандартный запрос Query DSL в формат, соответствующий документам сворачивания, а затем переписывает ответ в формат, ожидаемый клиентом, исходя из исходного запроса.
Параметры пути
-
<target> -
(Обязательно, строка) Список потоков данных и индексов, разделенных запятыми, используемых для ограничения запроса. Поддерживаются шаблоны с подстановкой (
*).Этот параметр может включать индексы как со сворачиванием, так и без него.
Правила для параметра
<target>:- Должен быть указан как минимум один поток данных, индекс или шаблон. Этот параметр может включать индекс со сворачиванием или без него. Для потоков данных поддерживаются только индексы, не участвующие в сворачивании. Нельзя опускать параметр
<target>или использовать_all. - Можно указать несколько индексов без сворачивания.
- Можно указать только один индекс со сворачиванием. Если указано больше одного, произойдет исключение.
- Поддерживаются шаблоны с подстановкой, но если они соответствуют более чем одному индексу со сворачиванием, произойдет исключение. Однако вы можете использовать шаблон для соответствия нескольким индексам или потокам данных без сворачивания.
- Должен быть указан как минимум один поток данных, индекс или шаблон. Этот параметр может включать индекс со сворачиванием или без него. Для потоков данных поддерживаются только индексы, не участвующие в сворачивании. Нельзя опускать параметр
Тело запроса
Тело запроса поддерживает подмножество функций из стандартного API поиска. Оно поддерживает:
- Параметр
queryдля задания запроса DSL, с некоторыми ограничениями (см. Ограничения поиска по сворачиваемым данным и Ограничения агрегации по сворачиваемым данным) - Параметр
aggregationsдля задания агрегаций
Недоступные функции:
-
size: Так как сворачивание работает с предварительно агрегированными данными, результаты поиска не возвращаются, поэтому размер (size) должен быть равен нулю или опущен. -
highlighter,suggestors,post_filter,profile,explain: Аналогично, эти функции запрещены.
Примеры
Пример поиска только по историческим данным
Представьте, что у нас есть индекс под названием sensor-1, заполненный исходными данными, и мы создали задание сворачивания с следующей конфигурацией:
resp = client.rollup.put_job(
id="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"
]
}
],
)
print(resp) const response = await client.rollup.putJob({
id: "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"],
},
],
});
console.log(response); 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:
resp = client.rollup.rollup_search(
index="sensor_rollup",
size=0,
aggregations={
"max_temperature": {
"max": {
"field": "temperature"
}
}
},
)
print(resp) response = client.rollup.rollup_search(
index: 'sensor_rollup',
body: {
size: 0,
aggregations: {
max_temperature: {
max: {
field: 'temperature'
}
}
}
}
)
puts response const response = await client.rollup.rollupSearch({
index: "sensor_rollup",
size: 0,
aggregations: {
max_temperature: {
max: {
field: "temperature",
},
},
},
});
console.log(response); 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. Если мы попробуем выполнить такой запрос:
resp = client.rollup.rollup_search(
index="sensor_rollup",
size=0,
aggregations={
"avg_temperature": {
"avg": {
"field": "temperature"
}
}
},
)
print(resp) response = client.rollup.rollup_search(
index: 'sensor_rollup',
body: {
size: 0,
aggregations: {
avg_temperature: {
avg: {
field: 'temperature'
}
}
}
}
)
puts response const response = await client.rollup.rollupSearch({
index: "sensor_rollup",
size: 0,
aggregations: {
avg_temperature: {
avg: {
field: "temperature",
},
},
},
});
console.log(response); 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 индексы с обычными данными:
resp = client.rollup.rollup_search(
index="sensor-1,sensor_rollup",
size=0,
aggregations={
"max_temperature": {
"max": {
"field": "temperature"
}
}
},
)
print(resp) response = client.rollup.rollup_search(
index: 'sensor-1,sensor_rollup',
body: {
size: 0,
aggregations: {
max_temperature: {
max: {
field: 'temperature'
}
}
}
}
)
puts response const response = await client.rollup.rollupSearch({
index: "sensor-1,sensor_rollup",
size: 0,
aggregations: {
max_temperature: {
max: {
field: "temperature",
},
},
},
});
console.log(response); GET sensor-1,sensor_rollup/_rollup_search
{
"size": 0,
"aggregations": {
"max_temperature": {
"max": {
"field": "temperature"
}
}
}
} | Обратите внимание, что URI теперь ищет по |
При выполнении поиска конечная точка выполняет два действия:
- Исходный запрос отправляется в индекс без сворачивания без изменений.
- Переписанная версия исходного запроса отправляется в индекс со сворачиванием.
После получения двух ответов конечная точка переписывает ответ со сворачиванием и объединяет их. Во время объединения, если в ответах есть перекрывающиеся корзины, используются корзины из индекса без сворачивания.
Ответ на вышеприведенный запрос выглядит так, как ожидалось, несмотря на то, что он охватывает индексы со сворачиванием и без него:
{
"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/8.17/rollup-search.html
|
|