点扩展处理器编辑

将带有点的字段扩展为对象字段。此处理器允许在管道中使用其他处理器访问带有点名称的字段。否则,任何处理器都无法访问这些字段。

表 15. 点扩展选项

名称 必需 默认值 描述

field

-

要扩展为对象字段的字段。如果设置为 *,则所有顶级字段将被扩展。

path

-

包含要扩展字段的字段。仅当要扩展的字段是另一个对象字段的一部分时才需要,因为 field 选项只能理解叶子字段。

override

false

控制当已存在与扩展字段冲突的嵌套对象时的行为。当 false 时,处理器将通过将旧值和新值合并到数组中来合并冲突。当 true 时,扩展字段的值将覆盖现有值。

description

-

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

if

-

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

ignore_failure

false

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

on_failure

-

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

tag

-

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

{
  "dot_expander": {
    "field": "foo.bar"
  }
}

例如,点扩展处理器将把此文档

{
  "foo.bar" : "value"
}

转换为

{
  "foo" : {
    "bar" : "value"
  }
}

如果在 foo 下面已经存在一个嵌套的 bar 字段,那么此处理器会将 foo.bar 字段合并到其中。如果该字段是标量值,那么它将把该字段转换为数组字段。

例如,以下文档

{
  "foo.bar" : "value2",
  "foo" : {
    "bar" : "value1"
  }
}

通过 dot_expander 处理器转换为

{
  "foo" : {
    "bar" : ["value1", "value2"]
  }
}

将其与 override 选项设置为 true 时的情况进行对比。

{
  "dot_expander": {
    "field": "foo.bar",
    "override": true
  }
}

在这种情况下,扩展字段的值将覆盖嵌套对象的值。

{
  "foo" : {
    "bar" : "value2"
  }
}

field 的值也可以设置为 * 以扩展所有顶级带点的字段名

{
  "dot_expander": {
    "field": "*"
  }
}

点扩展处理器将把此文档

{
  "foo.bar" : "value",
  "baz.qux" : "value"
}

转换为

{
  "foo" : {
    "bar" : "value"
  },
  "baz" : {
    "qux" : "value"
  }
}

如果带点字段嵌套在非带点结构中,则使用 path 选项来导航非带点结构

{
  "dot_expander": {
    "path": "foo"
    "field": "*"
  }
}

点扩展处理器将把此文档

{
  "foo" : {
    "bar.one" : "value",
    "bar.two" : "value"
  }
}

转换为

{
  "foo" : {
    "bar" : {
      "one" : "value",
      "two" : "value"
    }
  }
}

如果叶子字段之外的任何字段与具有相同名称的预先存在的字段冲突,则需要先重命名该字段。

考虑以下文档

{
  "foo": "value1",
  "foo.bar": "value2"
}

然后需要先重命名 foo,然后再应用 dot_expander 处理器。因此,为了使 foo.bar 字段正确地扩展到 foo 字段下的 bar 字段,应使用以下管道

{
  "processors" : [
    {
      "rename" : {
        "field" : "foo",
        "target_field" : "foo.bar"
      }
    },
    {
      "dot_expander": {
        "field": "foo.bar"
      }
    }
  ]
}

原因是摄取不知道如何自动将标量字段转换为对象字段。