Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Трубопроводы загрузки ›Справочник по процессорам загрузки

Процессор foreach

Выполняет процессор загрузки для каждого элемента массива или объекта.

Все процессоры загрузки могут работать с элементами массива или объекта. Однако, если количество элементов неизвестно, то обработка каждого элемента одинаковым способом может быть затруднительной.

Процессор foreach позволяет указать field, содержащий значения массива или объекта, и processor, который будет выполняться для каждого элемента в поле.

Таблица 20. Параметры Foreach

Имя Обязательно По умолчанию Описание

field

да

-

Поле, содержащее значения массива или объекта.

processor

да

-

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

ignore_missing

нет

false

Если true, процессор безмолвно завершает работу без изменения документа, если field имеет значение null или отсутствует.

description

нет

-

Описание процессора. Полезно для описания цели процессора или его конфигурации.

if

нет

-

Условное выполнение процессора. См. Условное выполнение процессора.

ignore_failure

нет

false

Игнорировать ошибки для процессора. См. Обработка ошибок в конвейере.

on_failure

нет

-

Обработка ошибок для процессора. См. Обработка ошибок в конвейере.

tag

нет

-

Идентификатор процессора. Полезно для отладки и метрик.

Ключи и значения доступа

При итерации по массиву или объекту процессор 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

Spec-Zone.ru

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