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