Foreach 处理器
编辑Foreach 处理器编辑
对数组或对象的每个元素运行摄取处理器。
所有摄取处理器都可以在数组或对象元素上运行。但是,如果元素数量未知,则以相同方式处理每个元素可能会很麻烦。
foreach
处理器允许您指定一个包含数组或对象值的 field
和一个要在该字段中的每个元素上运行的 processor
。
表 20. Foreach 选项
名称 | 必需 | 默认值 | 描述 |
---|---|---|---|
|
是 |
- |
包含数组或对象值的字段。 |
|
是 |
- |
要在每个元素上运行的摄取处理器。 |
|
否 |
false |
如果为 |
|
否 |
- |
处理器的描述。用于描述处理器的用途或其配置。 |
|
否 |
- |
有条件地执行处理器。请参阅有条件地运行处理器。 |
|
否 |
|
忽略处理器的故障。请参阅处理管道故障。 |
|
否 |
- |
处理处理器的故障。请参阅处理管道故障。 |
|
否 |
- |
处理器的标识符。用于调试和指标。 |
访问键和值编辑
迭代数组或对象时,foreach
处理器将当前元素的值存储在 _ingest._value
摄取元数据 字段中。_ingest._value
包含整个元素值,包括任何子字段。您可以使用 _ingest._value
字段上的点表示法访问子字段值。
迭代对象时,foreach
处理器还会将当前元素的键作为字符串存储在 _ingest._key
中。
您可以在 processor
中访问和更改 _ingest._key
和 _ingest._value
。有关示例,请参阅对象示例。
故障处理编辑
如果 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
定义。例如,并非所有 person 对象上都存在 id
字段。您可以使用 on_failure
块将文档发送到 failure_index 索引以供以后检查,而不是使索引请求失败
{ "foreach" : { "field" : "persons", "processor" : { "remove" : { "field" : "_value.id", "on_failure" : [ { "set" : { "field": "_index", "value": "failure_index" } } ] } } } }
在此示例中,如果 remove
处理器确实失败,则将更新到目前为止已处理的数组元素。