1.前言
ES 索引不支持直接修改某个字段类型,如果该索引中已经存在数据。
如果要修改字段类型,只能通过重建索引+数据迁移的方式来实现该效果。
2.步骤
2.1 操作流程图

2.2 具体步骤
注意下面的步骤,前提

相关的写 ES 业务逻辑已经停止
否则一直有数据写入的话,无法执行下面操作
2.2.1 新建临时索引
获取旧索引的 Mapping 和 Settings:

GET /old_index/_mapping
GET /old_index/_settings

创建新索引:


PUT /new_tmp_index
{
  "settings": {
    // 复制旧索引的设置,并根据需要进行修改
  },
  "mappings": {
    // 复制旧索引的mapping,并根据需要进行修改
  }
}

其中 settings 中有些信息需要删除掉,根据创建索引时报错提示信息来操作即可

比如如下信息需要删除

"provided_name": "old_index",
"creation_date": "1725618688486",
"uuid": "85ZDMiQmQsSzBFVLSeu6Xg",
"version": {
 "created": "8070199"
 }

mappings 根据新字段的类型需求进行修改

2.2.2 数据迁移

POST /_reindex
{
  "source": {
    "index": "old_index"  // 旧索引名称
  },
  "dest": {
    "index": "new_tmp_index"  // 新索引名称
  }
}

这个过程是异步的,需要通过查看页面来判断数据是否迁移完成

Index Management 页面,搜索两个索引,比较数量和大小,当数据一直时,表示迁移完成

2.2.3 清理旧索引数据

POST /old_index/_delete_by_query  
{  
  "query": {  
    "match_all": {}  
  }  
}

2.2.4 修改旧索引字段类型
修改 mappings 对应的字段

PUT old_index/_mapping
{
  "properties": {
    "test1": {
      "type": "keyword"
    },
    "test2": {
      "type": "keyword"
    },
    "test3": {
      "type": "keyword"
    }
  }
}

2.2.5 再将新临时索引的数据签回到旧索引中

POST /_reindex
{
  "source": {
    "index": "new_tmp_index"  // 新索引名称
  },
  "dest": {
    "index": "old_index"  // 旧索引名称
  }
}

做完这一步,其实已经达到了我们要的效果

同样这个过程是异步的,需要通过查看页面来判断数据是否迁移完成

Index Management 页面,搜索两个索引,比较数量和大小,当数据一直时,表示迁移完成

2.2.6 最后删除新临时索引
Index Management 页面找到新建的临时索引,点击名称超链接,再点击右下角的【Manage】按钮,Delete index 可以删除索引

作者:admin  创建时间:2024-11-28 15:28
最后编辑:admin  更新时间:2024-12-05 18:02