我在类型映射中添加了一个新属性,我需要重新索引该类型的所有现有项目才能使用新属性。
我应该使用哪种API来执行此操作?
答案 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中创建索引别名,您的代码将引用该别名。如果需要更改映射,则可以执行以下操作,以减少停机时间,甚至没有停机时间。
答案 2 :(得分:0)
您必须使用reindex api:首先必须创建新索引,然后您可以使用reidex api将源索引中的数据传输到新索引中。