ES6中如何将多类型索引指定类型数据迁移至单类型索引?
当然可行!其实Elasticsearch官方提供的_reindex API就是处理这类多类型转单类型数据迁移的最佳方案——比elasticdump更稳定,还原生适配ES环境,我给你详细拆解操作步骤:
一、先准备好目标新索引(pers-mac-assign-dev)
ES6的单类型索引默认使用doc作为唯一类型,所以得先确保新索引的结构和旧数据匹配:
- 先获取旧索引中
mac-assign类型的完整映射:
GET pers-mac-data-prod/_mapping/mac-assign
- 创建新索引,把拿到的映射里的类型替换成
doc,同时可以同步旧索引的分片、副本等配置(保证性能一致):
PUT pers-mac-assign-dev { "settings": { "number_of_shards": 5, # 替换成你旧索引的分片数 "number_of_replicas": 1 # 替换成你旧索引的副本数 }, "mappings": { "doc": { "properties": { # 把刚才GET到的mac-assign类型下的所有字段映射粘贴到这里 "mac_address": { "type": "keyword" }, "assign_time": { "type": "date" }, # ... 其他字段的映射内容 } } } }
二、执行数据迁移(核心步骤)
直接调用ES的_reindex接口,指定源索引、源类型,目标索引和目标类型,同时带上你已经写好的过滤条件:
POST _reindex { "source": { "index": "pers-mac-data-prod", "type": "mac-assign", "query": { "type": { "value": "mac-assign" } # 你的过滤条件,这里指定type后其实可以省略,但带上更保险 } }, "dest": { "index": "pers-mac-assign-dev", "type": "doc" # ES6单类型必须指定为doc }, "refresh": false, # 关闭实时刷新,大幅提升迁移速度,完成后手动刷新即可 "wait_for_completion": false # 如果数据量很大,建议设为false,后台异步执行,之后用GET _tasks/{task_id}查看进度 }
三、验证迁移结果
迁移完成后,一定要检查数据是否正确:
- 统计新索引的数据量,和旧类型的数据量对比:
GET pers-mac-assign-dev/_count
- 随机查询几条数据,确认字段和内容和旧数据一致:
GET pers-mac-assign-dev/_search { "size": 5 }
关于elasticdump失败的小补充
如果你还是想用elasticdump,大概率是参数配置有误,正确的命令应该是这样的(前提是已经全局安装elasticdump:npm install elasticdump -g):
elasticdump \ --input=http://你的ES地址:9200/pers-mac-data-prod/mac-assign \ --output=http://你的ES地址:9200/pers-mac-assign-dev/doc \ --input-filter='{"query": {"type": {"value": "mac-assign"}}}'
不过还是更推荐用_reindex,毕竟是ES原生功能,不需要额外依赖,稳定性和兼容性都更好。
内容的提问来源于stack exchange,提问作者Eskil K
相关产品推荐
相关产品推荐

