Процессор foreach
Выполняет процессор загрузки для каждого элемента массива или объекта.
Все процессоры загрузки могут работать с элементами массива или объекта. Однако, если количество элементов неизвестно, то обработка каждого элемента одинаковым способом может быть затруднительной.
Процессор foreach позволяет указать field, содержащий значения массива или объекта, и processor, который будет выполняться для каждого элемента в поле.
Таблица 20. Параметры Foreach
| Имя | Обязательно | По умолчанию | Описание |
|---|---|---|---|
| да | - | Поле, содержащее значения массива или объекта. |
| да | - | Процессор загрузки, который будет выполняться для каждого элемента. |
| нет | false | Если |
| нет | - | Описание процессора. Полезно для описания цели процессора или его конфигурации. |
| нет | - | Условное выполнение процессора. См. Условное выполнение процессора. |
| нет |
| Игнорировать ошибки для процессора. См. Обработка ошибок в конвейере. |
| нет | - | Обработка ошибок для процессора. См. Обработка ошибок в конвейере. |
| нет | - | Идентификатор процессора. Полезно для отладки и метрик. |
Ключи и значения доступа
При итерации по массиву или объекту процессор foreach сохраняет текущее значение элемента в поле _ingest._value метаданных загрузки. _ingest._value содержит полное значение элемента, включая все дочерние поля. Доступ к значениям дочерних полей можно получить с помощью нотации точек на поле _ingest._value.
При итерации по объекту процессор foreach также сохраняет текущий ключ элемента как строку в поле _ingest._key.
Вы можете получить доступ к _ingest._key и изменить _ingest._value в processor. Пример см. в примере с объектом.
Обработка ошибок
Если процессор foreach не может обработать элемент, и не указан процессор on_failure, процессор foreach безмолвно завершает работу. Это оставляет значение всего массива или объекта без изменений.
Примеры
В следующих примерах показано, как использовать процессор foreach с различными типами данных и параметрами:
Массив
Предположим следующий документ:
{
"values" : ["foo", "bar", "baz"]
} Когда этот процессор foreach работает с этим образцом документа:
{
"foreach" : {
"field" : "values",
"processor" : {
"uppercase" : {
"field" : "_ingest._value"
}
}
}
} Тогда документ будет выглядеть так после обработки:
{
"values" : ["FOO", "BAR", "BAZ"]
} Массив объектов
Предположим следующий документ:
{
"persons" : [
{
"id" : "1",
"name" : "John Doe"
},
{
"id" : "2",
"name" : "Jane Doe"
}
]
} В этом случае поле id необходимо удалить, поэтому используется следующий процессор foreach:
{
"foreach" : {
"field" : "persons",
"processor" : {
"remove" : {
"field" : "_ingest._value.id"
}
}
}
} После обработки результат:
{
"persons" : [
{
"name" : "John Doe"
},
{
"name" : "Jane Doe"
}
]
} Для другого примера массива объектов см. документацию по процессору вложений.
Объект
Процессор foreach также можно использовать для полей типа объект. Например, следующий документ содержит поле products со значениями типа объект.
{
"products" : {
"widgets" : {
"total_sales" : 50,
"unit_price": 1.99,
"display_name": ""
},
"sprockets" : {
"total_sales" : 100,
"unit_price": 9.99,
"display_name": "Super Sprockets"
},
"whizbangs" : {
"total_sales" : 200,
"unit_price": 19.99,
"display_name": "Wonderful Whizbangs"
}
}
} Следующий процессор foreach изменяет значение products.display_name на верхний регистр.
{
"foreach": {
"field": "products",
"processor": {
"uppercase": {
"field": "_ingest._value.display_name"
}
}
}
} При запуске на документе процессор foreach возвращает:
{
"products" : {
"widgets" : {
"total_sales" : 50,
"unit_price" : 1.99,
"display_name" : ""
},
"sprockets" : {
"total_sales" : 100,
"unit_price" : 9.99,
"display_name" : "SUPER SPROCKETS"
},
"whizbangs" : {
"total_sales" : 200,
"unit_price" : 19.99,
"display_name" : "WONDERFUL WHIZBANGS"
}
}
} Следующий процессор foreach устанавливает ключ каждого элемента в значение products.display_name. Если products.display_name содержит пустую строку, процессор удаляет элемент.
{
"foreach": {
"field": "products",
"processor": {
"set": {
"field": "_ingest._key",
"value": "{{_ingest._value.display_name}}"
}
}
}
} При запуске на предыдущем документе процессор foreach возвращает:
{
"products" : {
"Wonderful Whizbangs" : {
"total_sales" : 200,
"unit_price" : 19.99,
"display_name" : "Wonderful Whizbangs"
},
"Super Sprockets" : {
"total_sales" : 100,
"unit_price" : 9.99,
"display_name" : "Super Sprockets"
}
}
} Обработка ошибок
У обернутого процессора может быть определение on_failure. Например, поле id может отсутствовать у всех объектов person. Вместо того, чтобы не удавать запрос индексации, можно использовать блок on_failure, чтобы отправлять документ в индекс failure_index для последующего анализа:
{
"foreach" : {
"field" : "persons",
"processor" : {
"remove" : {
"field" : "_value.id",
"on_failure" : [
{
"set" : {
"field": "_index",
"value": "failure_index"
}
}
]
}
}
}
} В этом примере, если процессор remove завершится с ошибкой, элементы массива, которые были обработаны до этого момента, будут обновлены.
© 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/foreach-processor.html