Foreach 处理器

编辑

对数组或对象的每个元素运行 ingest 处理器。

所有 ingest 处理器都可以在数组或对象元素上运行。但是,如果元素的数量未知,以相同的方式处理每个元素可能会很麻烦。

foreach 处理器允许你指定一个包含数组或对象值的 field,以及一个要在该字段中每个元素上运行的 processor

表 20. Foreach 选项

名称 必需 默认值 描述

field

-

包含数组或对象值的字段。

processor

-

要在每个元素上运行的 Ingest 处理器。

ignore_missing

false

如果 true,如果 fieldnull 或缺失,则处理器会静默退出,而不更改文档。

description

-

处理器的描述。用于描述处理器的目的或其配置。

if

-

有条件地执行处理器。请参阅 有条件地运行处理器

ignore_failure

false

忽略处理器的失败。请参阅 处理管道失败

on_failure

-

处理处理器的失败。请参阅 处理管道失败

tag

-

处理器的标识符。用于调试和指标。

访问键和值

编辑

当遍历数组或对象时,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 处理器确实失败,那么到目前为止已处理的数组元素将被更新。