向映射添加属性是否需要重新索引?

时间:2018-07-24 14:50:50

标签: elasticsearch

docs on _update_by_query说:

  

_update_by_query的最简单用法只是在不更改源的情况下对索引中的每个文档执行更新。 这对于获取新属性或其他一些在线映射更改很有用。这是API:

POST twitter/_update_by_query?conflicts=proceed

(重点是我的)

加上introductory post to the Reindex API还可举例:

# But now I want to search on tags using the standard analyzer so I can search for banana and find bananas
...
# This doesn't take effect immediately
...
# But we can _update_by_query to pick up the new mapping on all documents

因此,当您将新属性添加到映射时,它不会自动为过去的文档建立索引。我不确定100%,因为第二个示例立即使用了 这个词,这给了我他们最终会使用 的印象。在第一个示例中,给出的具体情况是关闭了动态映射的索引。

因此,可以肯定的是,确实要添加新属性(或任何类型的映射更新)总是需要某种操作(更新或重新索引),以便先前的文档具有新的映射申请了吗?

1 个答案:

答案 0 :(得分:0)

您可以对现有映射进行非常few mapping changes的操作,最常见的是在现有字段中添加子字段。

例如,如果您有一个text字段,则可能要添加一个keyword子字段,以便在该字段上进行排序和汇总。

映射之前:

{
   "my_field": {
     "type": "text"
   },
   ...
}

之后映射:

{
   "my_field": {
     "type": "text",
     "fields": {
       "keyword": {
         "type": "keyword"
       }
     }
   },
   ...
}

可以在实时索引上进行映射更改。新文档将同时具有my_fieldmy_field.keyword字段,而旧文档将仅具有my_field。为了确保所有文档同时具有my_fieldmy_field.keyword,您只需点击_update_by_query API,所有文档都会被更新以满足新的映射要求。

请注意,按查询更新API可以在同一索引上运行,而Reindex API不会更新源索引,而是将数据从源索引重新索引到目标索引。

相关问题