Elasticsearch:Dot expander processor - 将带点的字段 foor.bar 扩展为 Object

Elastic 专栏收录该内容
494 篇文章 87 订阅

在我之前的文章 “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": "Beijing"
      }
    }
  ]
}

上面的结果显示:

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

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

{
    “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": {
        "geo": "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"
        }
      }
    }
  ]
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值