点展开处理器

编辑

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

表 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"
      }
    }
  ]
}

这样做的原因是 Ingest 不知道如何自动将标量字段转换为对象字段。