【发布时间】:2018-08-24 20:02:41
【问题描述】:
我向类型映射添加了一个新属性,我需要重新索引该类型的所有现有项才能使用新属性。
我应该使用哪个 API 来执行此操作?
【问题讨论】:
标签: elasticsearch elasticsearch-5 reindex
我向类型映射添加了一个新属性,我需要重新索引该类型的所有现有项才能使用新属性。
我应该使用哪个 API 来执行此操作?
【问题讨论】:
标签: elasticsearch elasticsearch-5 reindex
如果您要添加一个以前从未在索引中存在过的新字段,则无需重新索引,您只需使用 PUT Mapping API http://nocf-www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html添加新字段
您在使用新字段更新映射之前创建的文档将不包含此新字段,因此搜索或聚合不会考虑此字段,它将作为缺少的字段工作。
如果您需要在使用新字段类型的默认值搜索旧文档时考虑这个新字段,那么您需要重新索引。例如,如果您的新字段是整数类型,并且您明确需要将此字段包含在具有零值(默认值)的旧文档中,因为您想计算有多少文档具有此新字段 = 0,那么您需要重新索引,但是大多数用例我们可以将缺失字段视为默认值,因此无需重新索引。
在 ElastiSearch (ES) 中,无法在映射中添加新字段,并且旧索引会自动更新,即使由于 ES 存储数据的性质而使用该新索引的默认值也是如此。 ES 使用不可变段来存储索引,因此当您更新文档时,ES 不会物理更新已更改的字段,但它会创建旧文档的新副本,并使用新数据更新并将旧文档标记为已删除,因此即使您更新文档中的一个简单字段,您也会获得该文档的新版本,而旧版本将被标记为已删除
【讨论】:
另一种选择是在 Elasticsearch 中创建您的代码将引用的索引别名。如果您需要进行映射更改,您可以执行以下操作,这样可以减少停机时间。
【讨论】:
由于没有人愿意为这个长期存在的问题提供完整而明确的答案,所以我会去做:
# First of all: enable blocks write to enable clonage
PUT /my_index/_settings
{
"settings": {
"index.blocks.write": true
}
}
# clone index into a temporary index
POST /my_index/_clone/my_index-000001
# Copy back all documents in the original index to force their reindexetion
POST /_reindex
{
"source": {
"index": "my_index-000001"
},
"dest": {
"index": "my_index"
}
}
# Disable blocks write
PUT /my_index/_settings
{
"settings": {
"index.blocks.write": false
}
}
# Finaly delete the temporary index
DELETE my_index-000001
【讨论】:
您必须使用reindex api:首先您必须创建新索引,然后您可以使用reidex api将数据从源索引传输到新索引。
【讨论】: