Elasticsearch:Dot expander processor

2021年6月26日   |   by mebius

在我之前的文章 “Elasticsearch:Ingest Pipeline 实践”,有一个开发者在评论区问道像 foo.bar 这样的字段如何变成 object 数据类型。在实际的使用中,我们可以使用 dot expander 处理器。它将带点的字段扩展为对象字段。 此处理器允许管道中的其他处理器访问名称中带有点的字段。 否则,任何处理器都无法访问这些字段。

我将使用一个简单的例子来进行展示。

实例

我们首先来创建一个如下的 Ingest Pipeline:

POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "description": "Use dot expander to convert a field with dots into object",
    "processors": [
      {
        "dot_expander": {
          "field": "geo.city"
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "geo.city": "Beijing"
      }
    }
  ]
}

上面,我们使用了 dot expander 处理器。当我们的一个字段为 geo.city 时,我们想把它转换为 object。使用上面的 ingest pipeline 处理,我们可以可以看到如下的结果:

{
  "docs" : [
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : {
          "geo" : {
            "city" : "Beijing"
          }
        },
        "_ingest" : {
          "timestamp" : "2021-06-26T04:07:24.980082Z"
        }
      }
    }
  ]
}

显然,我们可以看到 city 现在是 geo object 下的一个字段了。

如果已经有一个 city字段嵌套在 geo下,则该处理器会将 geo.city字段合并到其中。 如果该字段是标量值,那么它将将该字段转换为数组字段。我们来看如下的例子:

POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "description": "Use dot expander to convert a field with dots into object",
    "processors": [
      {
        "dot_expander": {
          "field": "geo.city"
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "geo": {
          "city": "Shanghai"
        },
        "geo.city": "tgcodeBeijing"
      }
    }
  ]
}

上面的结果显示:

{
  "docs" : [
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : {
          "geo" : {
            "city" : [
              "Shanghai",
              "Beijing"
            ]
          }
        },
        "_ingest" : {
          "timestamp" : "2021-06-26T04:14:09.575254Z"
        }
      }
    }
  ]
}

如果 leaf field tgcode之外的任何字段与同名的预先存在的字段冲突,则需要先重命名该字段。比如:

{
    “geo": "Shanghai",
    "geo.city": "Beijing"    
}

然后在应用 dot_expander 处理器之前需要先重命名 geo。 因此,为了将 geo.city字段正确扩展到 geo 字段下的 city字段,应使用以下 pipelines:

POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "description": "Use dot expander to convert a field with dots into object",
    "processors": [
      {
        "rename": {
          "field": "geo",
          "target_field": "geo.city"
        }
      },
      {
        "dot_expander": {
          "field": "geo.city"
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "tgcodegeo": "Shanghai",
        "geo.city": "Beijing"
      }
    }
  ]
}

运行上面的命令。它显示的结果为”

{
  "docs" : [
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : {
          "geo" : {
            "city" : [
              "Shanghai",
              "Beijing"
            ]
          }
        },
        "_ingest" : {
          "timestamp" : "2021-06-26T04:21:17.33313Z"
        }
      }
    }
  ]
}

文章来源于互联网:Elasticsearch:Dot expander processor

相关推荐: Elasticsearch:如何在导入时忽略格式错误的数据

有时,你对收到的数据没有太多控制权。 一个用户可以发送一个日期形式的 login 字段,另一个用户发送一个电子邮件地址形式的 login 字段。 默认情况下,尝试将错误的数据类型索引到字段中会引发异常,并拒绝整个文档。 ignore_malformed 参数如…

Tags: