Foreach 处理器编辑

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

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

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

表 20. Foreach 选项

名称 必需 默认值 描述

field

-

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

processor

-

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

ignore_missing

false

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

description

-

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

if

-

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

ignore_failure

false

忽略处理器的故障。请参阅处理管道故障

on_failure

-

处理处理器的故障。请参阅处理管道故障

tag

-

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

访问键和值编辑

迭代数组或对象时,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 处理器确实失败,则将更新到目前为止已处理的数组元素。