在大模型应用落地过程中,检索系统的稳定性往往决定了最终体验。 最近我们将两个 RAG 项目合并,决定统一升级到 Elasticsearch 8.x。

一、迁移背景

部门内部以前有两个AI项目,都用到了RAG技术,最近领导打算将两个项目的知识检索部分进行合并作为一个公共的RAG底座。旧项目均使用Elasticsearch 7.x 作为向量数据库,现在决定新项目使用Elasticsearch 8.x 。要求RAG 检索能力不能中断,迁移后召回质量需保持稳定。因为一些原因,不太方便使用官方升级路线。而且数据量大,不能依赖人工重建索引+手工导入,最终方案是编写一个迁移脚本,完成:

  1. 索引结构迁移(mapping/settings)
  2. 向量字段自动适配
  3. 文档批量迁移
  4. 迁移报告输出

二、面临的问题:向量字段不兼容

旧版本中的向量字段定义,与 8.x 推荐的 dense_vector 方案存在差异。如果不先处理字段兼容,后续建索引、写数据、做召回都会出现连锁问题。

我们的做法是把“字段升级”前置到迁移脚本里: 迁移 mapping 时自动完成向量字段转换,并移除不再兼容的历史参数。

Mapping 定义对比示例

  1. X的定义:
{
  "properties": {
    "my_vector": {
      "type": "dense_vector",
      "dims": 768
    }
  }
}

8.X的定义

{
  "properties": {
    "my_vector": {
      "type": "dense_vector",
      "dims": 768,
      "element_type": "float",
      "index": true,
      "similarity": "cosine",
      "index_options": {
        "type": "int4_hnsw",
        "m": 16,
        "ef_construction": 100
      }
    }
  }
}

三、我们怎么实现的

整个迁移分为四步:

  1. 连接双集群(源 7.x、目标 8.x)
  2. 同步索引结构并完成兼容改造
  3. 通过滚动读取 + 批量写入迁移文档
  4. 自动输出迁移报告,沉淀可追踪结果

四、如何快速复用这套方案?

1.下载代码

https://github.com/WordLin/ElasticSearchData7_8

2.安装依赖

pip install -r requirements.txt

环境要求
* Python 3.9+
* 可访问的 Elasticsearch 7.x 源集群
* 可访问的 Elasticsearch 8.x 目标集群

3.配置源/目标集群与待迁移索引规则

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"]

程序逻辑如下:

  1. 自动跳过以 . 开头的系统索引
  2. 如果 specific_indices 非空:只迁移该列表中的索引
  3. 如果 specific_indices 为空:按 include_patternsexclude_patterns 过滤

5.操作步骤

1. 先小范围验证

先在 specific_indices 中只配置 1~2 个测试索引,确认迁移和查询结果正常后再全量执行。

2. 执行迁移
python main.py

执行后流程为:

  1. 连接源/目标集群
  2. 获取并过滤索引
  3. 迁移索引结构(mapping/settings)
  4. 分批迁移文档数据
  5. 输出迁移报告
3. 查看迁移报告

运行结束后,项目目录会生成:

migration_report_YYYYMMDD_HHMMSS.json

报告包含:

  • 总索引数
  • 总文档数 / 成功数 / 失败数
  • 成功率
  • 各索引的迁移状态与耗时
    报告会输出总文档量、成功率、索引级状态和耗时,便于团队验收与复盘。

五、迁移价值

这次升级带来的不是单点优化,而是底座能力增强:

  • 检索架构版本统一,后续迭代更轻量
  • 向量能力配置更规范,便于持续优化召回
  • 数据迁移过程可观测、可审计,降低上线风险

六、最后的建议

  1. 先跑通向量字段兼容,再谈全量迁移
  2. 小规模验证先行,逐步扩大迁移范围
  3. 用报告驱动验收,不靠“感觉迁完了”

参考文档:
7.x版本到8.15版本的变化史

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐