Elasticsearch重新索引现有类型映射中的项目

时间:2018-03-15 21:01:25

标签: elasticsearch elasticsearch-5 reindex

我在类型映射中添加了一个新属性,我需要重新索引该类型的所有现有项目才能使用新属性。

我应该使用哪种API来执行此操作?

3 个答案:

答案 0 :(得分:2)

如果要添加一个以前从未在索引中存在的新字段,则无需重新索引,只需使用PUT Mapping API添加新字段http://nocf-www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html

在使用新字段更新映射之前创建的文档不会包含此新字段,因此搜索或聚合不会考虑此字段,它将作为缺少的字段。

如果您需要使用新字段类型的默认值在旧文档搜索中考虑此新字段,则需要重新编制索引。例如,如果您的新字段是整数类型,并且明确需要将此字段包含在具有零值(默认值)的旧文档中,因为您要计算有多少文档具有此新字段= 0,那么您需要重新索引,但是在大多数用例中,我们可以将缺少的字段视为默认值,因此无需重新索引。

在ElastiSearch(ES)中无法在映射中添加新字段,并且由于ES存储数据的性质,即使使用新索引的默认值,也会自动更新旧索引。 ES使用不可变段来存储索引,因此在更新文档时,ES不会物理更新已更改的字段,但会创建使用新数据更新的旧文档的新副本,并将其标记为已删除旧文档,因此即使您更新文档中的简单字段,您也会获得该文档的新版本,旧文档将被标记为已删除

答案 1 :(得分:1)

另一个选择是在Elasticsearch中创建索引别名,您的代码将引用该别名。如果需要更改映射,则可以执行以下操作,以减少停机时间,甚至没有停机时间。

  • 使用更新的ES映射配置创建新索引
  • 使用reindex API将数据复制到此新索引
  • 删除旧的索引别名,然后使用相同的名称重新创建它。

答案 2 :(得分:0)

您必须使用reindex api:首先必须创建新索引,然后您可以使用reidex api将源索引中的数据传输到新索引中。