【问题标题】:How to change the field type in an ElasticSearch Index?如何更改 ElasticSearch 索引中的字段类型?
【发布时间】:2020-12-12 20:06:34
【问题描述】:

我有 index_A,其中包含一个数字字段“foo”。

我复制 index_A 的映射,并调用 PUT /index_B 并将字段 foo 更改为文本,因此映射部分是:

“富”:{ “类型”:“文本”, “字段”:{ “关键字”:{ “类型”:“关键字” } }

然后我将 index_A 重新索引到 index_B :

POST _reindex
{
  "source": {
    "index": "index_A"
  },
  "dest": {
    "index": "index_B"
  }
}

当我查看 index_B 的任何文档时,“foo”字段的条目仍然是一个数字。 (我期待例如: "foo": 30 在新文档的源中变成 "foo" : "30")。

尽管我阅读了有关映射和重新索引的内容,但我仍然不知道如何实现这一点。我需要运行什么才能获得这个带有“foo”作为文本字段的新索引,并且原始索引中 foo 的所有数字条目都更改为新索引中的文本条目?

【问题讨论】:

    标签: elasticsearch kibana


    【解决方案1】:

    字段的存储索引在ES中是有区别的。您在_source 中看到的内容被存储,它是您摄取的“原始”文档。但是没有基于映射类型的显式转换 - ES 存储它接收到的内容,然后按照映射中的定义继续索引它。

    为了验证字段的索引,您可以检查返回的脚本堆栈:

    GET index_b/_search
    {
      "script_fields": {
        "debugging_foo": {
          "script": {
            "source": "Debug.explain(doc['foo'])"
          }
        }
      }
    }
    

    相对于字段的存储方式

    GET index_b/_search
    {
      "script_fields": {
        "debugging_foo": {
          "script": {
            "source": "Debug.explain(params._source['foo'])"
          }
        }
      }
    }
    

    换句话说,请放心,foo 确实被索引为 text + keyword

    如果您想在_source 中将字段值显式转换为不同的数据类型,您可以应用如下脚本:

    POST _reindex
    {
      "source": {
        "index": "index_a"
      },
      "dest": {
        "index": "index_b"
      },
      "script": {
        "source": "ctx._source.foo = '' + ctx._source.foo"
      }
    }
    

    我对 java 不太熟悉,但我认为 ... = ctx._source.foo.toString() 也可以。


    仅供参考,有一个coerce mapping parameter,听起来可以在这里使用,但它只能以相反的方式工作——从字符串转换/解析为数字类型等。


    仅供参考#2 有一个名为 convert 的管道处理器,它完全按照我在上述脚本中所做的工作,等等。 (管道是一个预处理器,它在字段被 ES 索引之前运行。)管道的好处是它们也可以作为_reindex 进程的一部分运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      相关资源
      最近更新 更多