背景
Elasticsearch 是schema-less的数据存储方案。可以任意的向索引中添加字段。在此需明确以下背景:
- ES新添加的字段只对新数据、新type起作用;原有已经索引的数据不会生效;
- 为加快ES的检索和索引效率,构建索引时会指定其mapping结构;添加索引字段即修改mapping;
- 目前我们采用两种索引方案:
- 指定动态模板,每天生成新索引;
- 单索引多type:指定_default_mapping, 其每天的type主动继承mapping定义。
添加字段方案
针对A
该方案比较简单:只需在dynamic template中的mapping中添加新的字段即可;新生成的索引自动应用。刷数时,清理掉旧索引,创建新索引。
针对B
在_default_ mapping中添加字段定义。每日新生成的type会自动应用该字段。
刷数比较麻烦:1. 清理原有数据;使用 _delete_by_query;2. 使所有的type应用新添加的字段,使用
update_all_types, 如下图所示
PUT /my_index/_mapping/my_type?update_all_types
{
"properties": {
"title": {
"type": "string",
"analyzer": "english"
}
}
}
参考:https://stackoverflow.com/questions/36135937/set-update-all-types-to-true-on-elasticsearch