Elasticsearch 不允许直接修改现有索引的映射来添加新字段

由于 Elasticsearch 不允许直接修改现有索引的映射来添加新字段,您需要采取以下步骤来添加新字段:

1. **创建新索引**:
   创建一个新的索引,包含原始字段和您想要添加的新字段 `content`。

   ```json
   PUT /new_article
   {
     "mappings": {
       "_doc": {
         "properties": {
           "title": {
             "type": "text",
             "analyzer": "ik_max_word",
             "search_analyzer": "ik_max_word"
           },
           "desc": {
             "type": "text",
             "analyzer": "ik_max_word",
             "search_analyzer": "ik_max_word"
           },
           "content": {  // 新增字段
             "type": "text",
             "analyzer": "ik_max_word",
             "search_analyzer": "ik_max_word"
           }
         }
       }
     }
   }
   ```

2. **迁移数据**:
   使用 `_reindex` API 将数据从旧索引 `article` 迁移到新索引 `new_article`。

   ```json
   POST /_reindex
   {
     "source": {
       "index": "article"
     },
     "dest": {
       "index": "new_article"
     }
   }
   ```

3. **更新别名** (如果使用):
   如果您使用别名,需要更新别名指向新的索引。

   ```json
   POST /_aliases
   {
     "actions": [
       {
         "remove": {
           "index": "article",
           "alias": "article_alias"  // 假设您的别名是 article_alias
         }
       },
       {
         "add": {
           "index": "new_article",
           "alias": "article_alias"
         }
       }
     ]
   }
   ```

4. **删除旧索引** (可选):
   在确认新索引工作正常并且别名已经更新之后,您可以删除旧的索引以释放资源。

   ```json
   DELETE /article
   ```

5. **更新应用程序配置**:
   更新您的应用程序配置,确保它指向新的索引或别名。

请注意,这个过程涉及到数据迁移,因此在执行这些步骤之前,请确保您已经备份了数据,以防止数据丢失。此外,根据您的数据量大小,迁移数据可能需要一些时间,并且可能会对 Elasticsearch 集群的性能产生影响。建议在低峰时段进行这些操作。
 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Elasticsearch 的 dynamic templates 功能,通过配置模板来实现字段映射。 首先,在 Spring Boot 中配置 Elasticsearch 的时候,可以使用 `ElasticsearchRestTemplate` 来操作 Elasticsearch。在创建 `ElasticsearchRestTemplate` 的时候,可以指定一个 `ElasticsearchConverter` 对象,用于将 Java 对象转换成 Elasticsearch 中的文档。在 `ElasticsearchConverter` 中,可以使用 `MappingElasticsearchConverter` 对象来实现字段映射。 具体的操作步骤如下: 1. 配置 `ElasticsearchRestTemplate`,指定 `ElasticsearchConverter` 对象: ```java @Configuration public class ElasticsearchConfig { @Bean public ElasticsearchRestTemplate elasticsearchTemplate(RestHighLevelClient client, ElasticsearchConverter converter) { return new ElasticsearchRestTemplate(client, converter); } @Bean public ElasticsearchConverter elasticsearchConverter() { MappingElasticsearchConverter converter = new MappingElasticsearchConverter(elasticsearchMappingContext()); converter.setTypeMapper(new DefaultElasticsearchTypeMapper(null)); return converter; } @Bean public ElasticsearchMappingContext elasticsearchMappingContext() { return new ElasticsearchMappingContext(); } } ``` 2. 在 `ElasticsearchMappingContext` 中配置 dynamic templates: ```java @Configuration public class ElasticsearchConfig { @Bean public ElasticsearchMappingContext elasticsearchMappingContext() { ElasticsearchMappingContext context = new ElasticsearchMappingContext(); context.setInitialEntitySet(getInitialEntitySet()); context.setSimpleTypeHolder(customSimpleTypeHolder()); context.setApplicationContext(applicationContext); // 配置 dynamic templates context.setDynamicTemplates(Arrays.asList( new DynamicTemplate("camel_case_to_underscore", new MappingBuilder() .match("*") .unmatch("*_text") .mapping(new ObjectMapping() .setType("text") .setNormalizer("lowercase") .addProperty("type", "keyword") .addProperty("fields", new ObjectMapping() .addProperty("raw", new ObjectMapping() .setType("keyword") ) ) ) ) )); return context; } } ``` 上述代码中,我们创建了一个名为 `camel_case_to_underscore` 的 dynamic template,并将其应用到所有字段上(使用 `match("*")`),但排除了以 `_text` 结尾的字段(使用 `unmatch("*_text")`)。对于所有匹配的字段,我们都将其映射为 `text` 类型,使用 `lowercase` 正则表达式将其转换为小写,同时添加了一个 `raw` 子字段,用于排序和聚合操作。 这样,我们就完成了将 Java 中的驼峰命名转换为 Elasticsearch 中的下划线命名的操作。在使用 `ElasticsearchRestTemplate` 进行 CRUD 操作时,会自动将 Java 对象转换为 Elasticsearch 中的文档,并将字段映射为下划线命名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值