从此页面:https://www.elastic.co/blog/changing-mapping-with-zero-downtime它声明:
我不关心旧数据 如果要更改单个字段的数据类型,并且不关心旧数据不可搜索的事实,该怎么办?在这种情况下,您有几个选择:
删除映射 如果删除特定类型的映射,则可以使用put_mapping API。在现有索引中为该类型创建新映射。
...
我的情况是,我有一个字符串,我希望将其更改为长...根据该文档,听起来我应该能够做到:
curl -X DELETE localhost:9200/my_index/_mapping/property_to_change
然后再做
curl -XPUT 'http://localhost:9200/my_index/_mapping/property_to_change' -d '
{
"my_index" : {
"properties" : {
"property_to_change" : {"type" : "long", "store" : true }
}
}
}
'
我误解了这个吗?我真的要经历创建别名的麻烦吗?有没有一种简单的方法可以改变这个属性的类型?
我发现有关此主题的文档引起高度混淆和矛盾......例如此页https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-intro.html 表示:
您可以在首次创建索引时指定类型的映射。或者,您可以稍后使用/ _mapping端点为新类型添加映射(或更新现有类型的映射)。
听起来像 - 好酷。这正是我想要做的。
然后下一段说:
虽然您可以添加到现有映射,但您无法更改它。如果映射中已存在某个字段,则该字段中的数据可能已被索引。如果您要更改字段映射,则已编入索引的数据将是错误的,并且无法正确搜索。
我以为它只是说你可以更新映射?现在它说你不能改变它?太混乱了。
任何人都可以对此有所了解吗?
答案 0 :(得分:1)
或者,您可以稍后使用/ _mapping端点为新类型添加映射(或更新现有类型的映射)。
Update
意味着您可以使用该字段执行任何操作,隐式更改类型。您可以将很少的东西更改为现有字段。例如,sub-section called "Upgrade to a multi-field"中描述了其中一个。
但是,如果您想将类型从string
更改为long
或反之亦然,或将index
从analyzed
更改为not_analyzed
或任何其他可能影响字段内容保存在索引本身中的更改,这是不可能的。
答案 1 :(得分:0)
您无法更改现有字段的映射。在Elasticsearch的说法中,类型是一类类似的文档,您可以为其添加更新的映射(添加新的字段映射),但不能更改字段的现有映射。
例如,如果documents
类型包含title
和tags
字段的映射,则可以为该类型添加更新的映射,为{{1}添加映射} field,但您无法将author
从一种类型更改为另一种类型,或更改映射选项或其他内容。
如果要将字段从字符串更改为long,则需要删除索引(或类型的映射,如果索引仅包含一种类型,则等效),创建一个带有所需映射的新索引,然后将数据重新索引到其中。