用于将 Elasticsearch 7.x 的索引与数据迁移到 Elasticsearch 8.x,重点处理向量字段兼容和大批量数据搬迁。
- 连接源集群(ES 7.x)和目标集群(ES 8.x)
- 按规则过滤待迁移索引(支持白名单、包含/排除模式)
- 自动迁移索引
mapping/settings - 自动适配向量字段:
type: vector升级为type: dense_vector- 清理 8.x 不支持的旧参数
- 使用
scan + bulk批量迁移数据 - 生成迁移报告
migration_report_*.json
.
├─ main.py # 迁移主程序
├─ config.py # 读取 config.yaml
├─ requirements.txt # 依赖
└─ config.yaml # 运行前需要自行创建
- Python 3.9+
- 可访问的 Elasticsearch 7.x 源集群
- 可访问的 Elasticsearch 8.x 目标集群
pip install -r requirements.txt程序默认读取项目根目录下的 config.yaml。请先创建该文件。
migration_config:
source:
hosts: ["http://127.0.0.1:9200"]
username: "elastic"
password: "source_password"
verify_certs: false
target:
hosts: ["https://127.0.0.1:9201"]
username: "elastic"
password: "target_password"
verify_certs: false
ca_certs: null
migration:
batch_size: 500
scroll_time: "5m"
concurrent_workers: 1
indices:
# 指定具体索引(非空时,仅迁移这里列出的索引)
specific_indices: []
# 当 specific_indices 为空时生效:索引名包含任一字符串即匹配
include_patterns: ["rag", "kb"]
# 排除规则:索引名包含任一字符串即排除
exclude_patterns: [".kibana", ".security"]程序逻辑如下:
- 自动跳过以
.开头的系统索引 - 如果
specific_indices非空:只迁移该列表中的索引 - 如果
specific_indices为空:按include_patterns与exclude_patterns过滤
先在 specific_indices 中只配置 1~2 个测试索引,确认迁移和查询结果正常后再全量执行。
python main.py执行后流程为:
- 连接源/目标集群
- 获取并过滤索引
- 迁移索引结构(mapping/settings)
- 分批迁移文档数据
- 输出迁移报告
运行结束后,项目目录会生成:
migration_report_YYYYMMDD_HHMMSS.json
报告包含:
- 总索引数
- 总文档数 / 成功数 / 失败数
- 成功率
- 各索引的迁移状态与耗时
- 对比源/目标索引文档总量(
_count) - 抽样核对关键字段(含向量字段维度)
- 使用业务查询验证检索结果是否符合预期
请确认项目根目录存在 config.yaml,且字段结构与示例一致。
- 检查
hosts、账号密码是否正确 - 检查网络连通与防火墙
- HTTPS 场景确认
verify_certs与证书配置是否匹配
程序会跳过已存在索引的创建,但仍会继续数据迁移。
如需重跑全量,请先手动清理目标索引(谨慎操作)。
- 当前脚本按顺序迁移索引(
concurrent_workers当前版本未启用并发) - 脚本会尝试创建别名:新别名名为“索引名去掉最后 3 个字符”,请确认你的索引命名符合预期
- 生产迁移前建议先在测试环境完整演练