如何使用Java将Solr v4旧Core迁移至其他版本的Solr服务
旧版Solr Core到新版Solr Core的Java迁移可行方案
完全可以通过Java程序实现跨版本Solr Core迁移,以下是两种生产环境验证过的技术方案:
方案1:基于SolrJ客户端的同步方案(兼容性最好、通用度最高)
该方案不需要操作Solr底层文件,仅通过HTTP接口完成数据同步,适配绝大多数跨版本迁移场景,只要分别引入适配新旧Solr服务端版本的SolrJ依赖即可。
- 前置操作:先在新版Solr集群创建目标Core,确保Schema、solrconfig.xml配置和旧Core对齐,避免字段类型、分词规则不匹配导致的写入报错。
- 引入SolrJ依赖示例(Maven),如果跨大版本存在依赖冲突,可以用类隔离框架或者拆分两个独立服务对接新旧Solr,通过内存队列/消息队列传递数据:
<!-- 适配旧版Solr的SolrJ,以Solr7.7.3为例 --> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>7.7.3</version> </dependency> <!-- 适配新版Solr的SolrJ,以Solr9.3.0为例 --> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>9.3.0</version> </dependency>
- 全量同步代码示例,用游标查询避免深分页性能问题:
import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.params.CursorMarkParams; import org.apache.solr.client.solrj.SolrQuery; public class SolrMigration { public static void main(String[] args) throws Exception { // 初始化新旧Solr客户端 HttpSolrClient oldClient = new HttpSolrClient.Builder("http://旧Solr地址/solr/旧Core名称").build(); HttpSolrClient newClient = new HttpSolrClient.Builder("http://新Solr地址/solr/新Core名称").build(); // 游标查询配置 SolrQuery query = new SolrQuery("*:*"); query.setRows(1000); // 单次拉取条数可根据服务器配置调整 query.setSort("id", SolrQuery.ORDER.asc); String cursorMark = CursorMarkParams.CURSOR_MARK_START; boolean syncFinish = false; while (!syncFinish) { query.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark); QueryResponse resp = oldClient.query(query); String nextCursor = resp.getNextCursorMark(); // 写入新Core newClient.add(resp.getResults()); newClient.commit(); // 判断是否拉取完成 if (cursorMark.equals(nextCursor)) { syncFinish = true; } cursorMark = nextCursor; } oldClient.close(); newClient.close(); } }
- 全量同步完成后,可基于业务的更新时间字段做增量同步,业务切流前执行一次最终增量同步即可完成迁移。
方案2:基于索引文件直接读写的迁移方案(适配TB级大数据量场景)
如果数据量过大,HTTP同步效率低,可以直接基于Lucene API读写索引文件完成迁移:
- 先确认新旧Solr对应的Lucene版本兼容性,Lucene支持跨1个大版本读取索引,跨多个大版本需要先对旧索引做版本升级。
- 用
IndexReader读取旧Core的索引文件,遍历所有文档转换为新Core适配的结构后,直接写入新Core的索引目录,最后在新版Solr执行Core reload即可。
迁移校验要求
迁移完成后必须做一致性校验:
- 统计新旧Core的全量文档数,确保数量一致
- 抽样1%~5%的文档对比字段内容、分词结果是否完全匹配
- 验证排序、聚合、高亮等业务常用查询功能是否正常
内容的提问来源于stack exchange,提问作者ANBU RAJA
相关产品推荐
相关产品推荐

