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

Posted Elastic 中国社区官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch:Dot expander processor - 将带点的字段 foor.bar 扩展为 Object相关的知识,希望对你有一定的参考价值。

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

以上是关于Elasticsearch:Dot expander processor - 将带点的字段 foor.bar 扩展为 Object的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 numba 代码比 numpy 代码慢 6 倍?

为什么graphviz dot不能打开一个dot文件?

安卓手机如何打开.dot文件?

为啥我的系统 ld 脚本使用像“dot = dot”这样的表达式?

pydot 和 graphviz 错误:无法导入 dot_parser,无法加载 dot 文件

expand和extend的区别