elasticsearch 如何更改ElasticSearch索引中的字段类型?,elasticsearch,kibana,elasticsearch,Kibana" /> elasticsearch 如何更改ElasticSearch索引中的字段类型?,elasticsearch,kibana,elasticsearch,Kibana" />

elasticsearch 如何更改ElasticSearch索引中的字段类型?

elasticsearch 如何更改ElasticSearch索引中的字段类型?,elasticsearch,kibana,elasticsearch,Kibana,我有索引A,其中包括一个数字字段“foo” 我复制索引A的映射,并进行dev tools调用PUT/index\u B,字段foo更改为text,因此其映射部分是: “foo”:{ “类型”:“文本”, “字段”:{ “关键字”:{ “类型”:“关键字” } } 然后,我使用以下方法将索引A重新索引为索引B: POST _reindex { "source": { "index": "index_A" }, &quo

我有索引A,其中包括一个数字字段“foo”

我复制索引A的映射,并进行dev tools调用
PUT/index\u B
,字段foo更改为text,因此其映射部分是:

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

然后,我使用以下方法将索引A重新索引为索引B:

POST _reindex
{
  "source": {
    "index": "index_A"
  },
  "dest": {
    "index": "index_B"
  }
}
当我查看索引_B的任何文档时,“foo”字段的条目仍然是一个数字(例如,我希望“foo”:30在新文档的源中变成“foo”:“30”)


尽管我已经读了很多关于映射和重新索引的书,但我仍然不知道如何实现这一点。我需要具体运行什么才能获得这个带有“foo”的新索引作为文本字段,原始索引中foo的所有数字项都更改为新索引中的文本项?

字段的存储方式与ES中的索引方式有区别。您在
\u 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
确实被索引为
文本
+
关键字

如果要将字段值显式强制转换为
\u source
中的不同数据类型,可以应用以下脚本:

POST _reindex
{
  "source": {
    "index": "index_a"
  },
  "dest": {
    "index": "index_b"
  },
  "script": {
    "source": "ctx._source.foo = '' + ctx._source.foo"
  }
}
我不太熟悉java,但我认为
..=ctx.\u source.foo.toString()
也可以


仅供参考,这里有一个听起来很有用的方法,但它只能以另一种方式工作——从字符串到数字类型的转换/解析等等



仅供参考#2有一个名为pipeline processor的管道处理器,它与我在上述脚本中所做的完全相同,而且还有更多功能。(管道是在字段在ES中索引之前运行的预处理器。)管道的好处是,它们也可以作为
\u reindex
过程的一部分运行。

字段在ES中的存储方式和索引方式是有区别的。您在
\u 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
确实被索引为
文本
+
关键字

如果要将字段值显式强制转换为
\u source
中的不同数据类型,可以应用以下脚本:

POST _reindex
{
  "source": {
    "index": "index_a"
  },
  "dest": {
    "index": "index_b"
  },
  "script": {
    "source": "ctx._source.foo = '' + ctx._source.foo"
  }
}
我不太熟悉java,但我认为
..=ctx.\u source.foo.toString()
也可以


仅供参考,这里有一个听起来很有用的方法,但它只能以另一种方式工作——从字符串到数字类型的转换/解析等等


供参考#2有一个名为的管道处理器,它与我在上述脚本中所做的完全相同,等等。(管道是在字段在ES中索引之前运行的预处理器。)管道的好处是,它们也可以作为
\u reindex
过程的一部分运行