我在类型映射中添加了一个新属性,我需要重新索引该类型的所有现有项目才能使用新属性。
我应该使用哪个 API 来执行此操作?
如果要添加一个以前从未存在于索引中的新字段,则无需重新编制索引,只需使用 PUT 映射 API 添加新字段 http://nocf-www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html
在使用新字段更新映射之前创建的文档将不包含此新字段,因此搜索或聚合不会考虑此字段,它将作为缺失字段工作。
如果需要使用新字段类型的默认值在旧文档的搜索中考虑此新字段,则需要重新编制索引。例如,如果您的新字段是整数类型,并且您明确需要将此字段包含在具有零值(默认值)的旧文档中,因为您想计算有多少文档具有此新字段 = 0,那么您需要重新索引,但大多数用例我们可以将缺少字段视为默认值, 所以无需重新索引。
在 ElastiSearch (ES) 中无法在映射中添加新字段,并且由于 ES 存储数据的性质,即使使用该新索引的默认值,旧索引也会自动更新。ES 使用不可变段来存储索引,因此当您更新文档时,ES 不会物理更新更改的字段,而是创建使用新数据更新的旧文档的新副本,并将旧文档标记为已删除,因此即使您更新文档中的简单字段,您也会获得文档的新版本,而旧文档将标记为已删除
您需要执行这些命令。将my_index替换为索引的名称。
# 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
# Disable blocks write
PUT /my_index/_settings
{
"settings": {
"index.blocks.write": false
}
}
# Copy back all documents in the original index to force their reindexetion
POST /_reindex?wait_for_completion=false
{
"source": {
"index": "my_index-000001"
},
"dest": {
"index": "my_index"
}
}
# Copy the task id from the previous result and check the progression:
GET /_tasks/K1IOaNo8R26gRwc55yXJLQ:1165945865
# Finaly delete the temporary index
DELETE my_index-000001
它的作用:
- 将索引克隆为临时索引
- 然后将所有文档从临时索引重新索引到原始索引。这将覆盖现有文档并重新生成缺少的字段。
警告: 此方法假定不会在索引中插入任何新数据。在重新索引过程中,新数据将被覆盖。
另一种选择是在 Elasticsearch 中创建一个索引别名,您的代码将引用该别名。 如果需要进行映射更改,可以执行以下操作,这将允许很少甚至没有停机时间。
- 使用更新的 ES 映射配置创建新索引
- 使用重新索引 API 将数据复制到此新索引
- 删除旧的索引别名,然后使用相同的名称重新创建它。
您必须使用 reindex api:首先您必须创建新索引,然后您可以使用 reidex API 将数据从源索引传输到新索引中。