试图了解如何在不需要完全重建索​​引的情况下更新映射?

时间:2015-07-08 22:11:09

标签: elasticsearch

从此页面: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端点为新类型添加映射(或更新现有类型的映射)。

听起来像 - 好酷。这正是我想要做的。

然后下一段说:

  

虽然您可以添加到现有映射,但您无法更改它。如果映射中已存在某个字段,则该字段中的数据可能已被索引。如果您要更改字段映射,则已编入索引的数据将是错误的,并且无法正确搜索。

我以为它只是说你可以更新映射?现在它说你不能改变它?太混乱了。

任何人都可以对此有所了解吗?

2 个答案:

答案 0 :(得分:1)

  

或者,您可以稍后使用/ _mapping端点为新类型添加映射(或更新现有类型的映射)。

Update 意味着您可以使用该字段执行任何操作,隐式更改类型。您可以将很少的东西更改为现有字段。例如,sub-section called "Upgrade to a multi-field"中描述了其中一个。

但是,如果您想将类型从string更改为long或反之亦然,或将indexanalyzed更改为not_analyzed或任何其他可能影响字段内容保存在索引本身中的更改,这是不可能的。

答案 1 :(得分:0)

您无法更改现有字段的映射。在Elasticsearch的说法中,类型是一类类似的文档,您可以为其添加更新的映射(添加新的字段映射),但不能更改字段的现有映射。

例如,如果documents类型包含titletags字段的映射,则可以为该类型添加更新的映射,为{{1}添加映射} field,但您无法将author从一种类型更改为另一种类型,或更改映射选项或其他内容。

如果要将字段从字符串更改为long,则需要删除索引(或类型的映射,如果索引仅包含一种类型,则等效),创建一个带有所需映射的新索引,然后将数据重新索引到其中。