如何在Spring Boot中不改动现有配置连接不同版本Elasticsearch
如何在Spring Boot中同时连接Elasticsearch 8.4.3和2.4(不修改现有配置)
问题描述
我在Spring Boot项目中使用spring-data-elasticsearch 4.4.5连接Elasticsearch 8.4.3,现在需要连接另一台老旧的Elasticsearch 2.4,但该版本的Spring Data不支持ES 2.4。请问如何在不修改现有配置的前提下连接这台旧ES?
现有配置与仓库代码
现有ES 8.4.3配置类
public class EsConfig extends ElasticsearchConfiguration { // @Override public ClientConfiguration clientConfiguration() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(esUrl) .usingSsl() .withBasicAuth(esUserName, esPassword) .withConnectTimeout(Duration.ofMillis(connectionTimeout)) .withSocketTimeout(Duration.ofMillis(socketTimeout)) .build(); return clientConfiguration; } }
现有Spring Data仓库接口
@Repository public interface MyRepository extends ElasticsearchRepository<MyEntity, String> { /// }
解决方案
由于spring-data-elasticsearch 4.4.5仅兼容Elasticsearch 7.x和8.x版本,与ES 2.4的协议、API差异极大,无法通过Spring Data的统一接口同时支持两个版本。因此需要单独引入ES 2.4专属客户端,与现有配置完全隔离,具体步骤如下:
1. 引入ES 2.4客户端依赖
在Maven中添加ES 2.4的elasticsearch-transport依赖,并排除spring-data-elasticsearch中自带的高版本ES依赖,避免冲突:
<!-- 保留原有的spring-data-elasticsearch依赖,排除冲突模块 --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>4.4.5</version> <exclusions> <exclusion> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </exclusion> <exclusion> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加ES 2.4客户端依赖 --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>2.4.6</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-transport</artifactId> <version>2.4.6</version> </dependency>
2. 配置独立的ES 2.4客户端
创建一个独立的配置类,初始化ES 2.4的TransportClient,与现有ES 8.4.3的配置完全隔离:
@Configuration public class Es24Config { @Value("${es24.cluster-name}") private String clusterName; @Value("${es24.nodes}") private String nodes; // 配置格式:host1:9300,host2:9300 @Bean(name = "es24Client") public TransportClient es24Client() throws UnknownHostException { // 配置ES集群信息 Settings settings = Settings.settingsBuilder() .put("cluster.name", clusterName) .build(); TransportClient client = TransportClient.builder().settings(settings).build(); // 解析节点地址并添加到客户端 String[] nodeArray = nodes.split(","); for (String node : nodeArray) { String[] hostPort = node.split(":"); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hostPort[0]), Integer.parseInt(hostPort[1]))); } return client; } }
3. 编写ES 2.4操作类
直接使用TransportClient实现对ES 2.4的CRUD操作,不依赖Spring Data的Repository:
@Service public class Es24Service { @Autowired @Qualifier("es24Client") // 指定注入ES 2.4的客户端 private TransportClient es24Client; // 示例:查询单条文档 public Map<String, Object> getDocument(String index, String type, String id) { GetResponse response = es24Client.prepareGet(index, type, id).get(); return response.isExists() ? response.getSource() : null; } // 示例:新增文档 public void saveDocument(String index, String type, String id, Map<String, Object> data) { IndexResponse response = es24Client.prepareIndex(index, type, id) .setSource(data) .get(); // 可根据response处理结果 } // 其他操作(搜索、删除等)可参考ES 2.4的TransportClient API实现 }
关键说明
- 此方案完全不修改原有ES 8.4.3的配置和Repository,两个ES集群的客户端相互独立,不会互相影响。
- ES 2.4的
TransportClient是该版本的官方客户端,需严格匹配ES版本(建议使用2.4.6,与ES 2.4.3兼容)。 - 由于ES 2.4已停止维护,建议后续逐步迁移数据到高版本ES,避免长期维护多版本客户端的复杂度。
内容的提问来源于stack exchange,提问作者mahfuj asif
相关产品推荐
相关产品推荐

