背景

我们都知道,ES是可以自动创建索引的,如果没有指定字段映射,ES会根据写入的数据来对字段进行动态映射的。假设我们目前有一个索引index-1,一个字段应该为number类型,但索引创建时的数据可能存在脏数据,该字段被映射为了text类型,导致整个索引创建时就将该字段设置为了text类型。我们知道,ES中索引一旦创建,索引中字段的数据类型是不能修改的,但我们可以新建一个索引并指定索引的映射,再将数据迁移过去,曲线救国。

创建新索引并指定字段映射

此处我们要将callTimeLength字段映射为long类型

PUT /index-2
{
  "mappings": {
      "properties": {
        "callTimeLength": {
          "type": "long"
        }
      }
    }
}

将旧索引数据reindex到新索引

POST _reindex
{
  "source": {
    "index": "index-1"
  },
  "dest": {
    "index": "index-2"
  }
}

关于reindex的介绍放在最后[reindex介绍](# 附:reindex介绍)

执行成功后要等待一段时间,根据要reindex数据的大小需要等待不同的时间完成数据的复制。

将旧索引新建并reindex

等待上一步reindex完成后,index-2中的数据就与index-1中的数据相同了。

接下来删除index-1

DELETE /index-1

然后新建index-1

PUT /index-1
{
  "mappings": {
      "properties": {
        "callTimeLength": {
          "type": "long"
        }
      }
    }
}

再将index-2中的数据reindex到新的index-1

POST _reindex
{
  "source": {
    "index": "index-2"
  },
  "dest": {
    "index": "index-1"
  }
}

等待数据reindex完成后,查看index-1的映射,数据完成了callTimeLength字段的数据类型更改。

附:reindex介绍

基本介绍

The most basic form of _reindex just copies documents from one index to another.

(_reindex 最基本的形式只是将文档从一个索引复制到另一个索引。)

适用场景

  1. 分片数变更:当你的数据量过大,而你的索引最初创建的分片数量不足,导致数据入库较慢的情况,此时需要扩大分片的数量,此时可以尝试使用Reindex。
  2. mapping字段变更:当数据的mapping需要修改,但是大量的数据已经导入到索引中了,重新导入数据到新的索引太耗时;但是在ES中,一个字段的mapping在定义并且导入数据之后是不能再修改的,所以这种情况下也可以考虑尝试使用Reindex。
  3. 分词规则修改,比如使用了新的分词器或者对分词器自定义词库进行了扩展,而之前保存的数据都是按照旧的分词规则保存的,这时候必须进行索引重建。

基本用法

POST _reindex
{
  "source": {
    "index": "index-old"
  },
  "dest": {
    "index": "index-new"
  }
}

ES官方reindex文档

广告时间

既然自己维护ES这么复杂,不如试试腾讯云 Elasticsearch Service

腾讯云 Elasticsearch Service(ES)是基于开源引擎打造的云端全托管 ELK 服务,集成 X-Pack 特性、独有高性能自研内核、QQ 分词、集群巡检、一键升级等优势能力,引入极致性价比的腾讯自研星星海服务器。助您轻松管理和运维集群,高效构建日志分析、运维监控、信息检索、数据分析等业务。

【腾讯云】ElasticSearch新用户特惠,快速实现日志分析、应用搜索,首购低至4折

ES产品_560 300

↑↑↑现在新用户免费试用30天,快点击上方连接开启试用吧。↑↑↑