文章目录
- 一,技术选型
-
- [1. 通过 TCP 连接(9300 端口)](#1. 通过 TCP 连接(9300 端口))
- [2. 通过 HTTP 连接(9200 端口)](#2. 通过 HTTP 连接(9200 端口))
- 3.最终选择
- 二,SpringBoot整合Elasticsearch-Rest-High-Level-Client
- 整合问题记录
一,技术选型
在Java项目中整合Elasticsearch (ES) 的过程中,通常会面临多种客户端的选择。
1. 通过 TCP 连接(9300 端口)
- Transport API (
spring-data-elasticsearch:transport-api.jar
) :- 与 Spring Boot 版本有关,不同版本的 Spring Boot 需要不同的 Transport API 版本来适配不同的 Elasticsearch 版本。
- 在 Elasticsearch 7.x 版本开始,官方已经不建议使用 Transport API,并且在 Elasticsearch 8.x 及以上版本中已被废弃。
2. 通过 HTTP 连接(9200 端口)
- JestClient :
- 非官方客户端,更新速度较慢,可能会出现与最新版本的 Elasticsearch 兼容性问题。
- RestTemplate :
-
使用标准的 HTTP 客户端来发送请求,适用于对 HTTP 协议有深入了解的开发者。
-
需要手动封装 ES 的各种操作,增加了开发的工作量和复杂度。
-
如
RestTemplate
需要手动构建 JSON 格式的请求体。javapublic class ElasticsearchExample { public static void main(String[] args) { RestTemplate restTemplate = new RestTemplate(); String indexName = "example_index"; String query = "{\"query\": {\"match_all\": {}}}"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(org.springframework.http.MediaType.APPLICATION_JSON); HttpEntity<String> entity = new HttpEntity<>(query, headers); ResponseEntity<String> response = restTemplate.exchange( "http://localhost:9200/" + indexName + "/_search", HttpMethod.POST, entity, String.class ); System.out.println(response.getBody()); } }
-
3.最终选择
基于上述分析,推荐使用 Elasticsearch-Rest-High-Level-Client 作为 Java 应用程序与 Elasticsearch 交互的客户端。这是因为它不仅是由 Elasticsearch 官方维护和支持的,而且提供了良好的 API 封装,使得开发者能够更加专注于业务逻辑而不是底层细节。
二,SpringBoot整合Elasticsearch-Rest-High-Level-Client
1,新增模块gulimall-search
对于这个模块,做一下基本配置。
- 配置注册中心地址
- 配置启动类服务发现注解
1,添加依赖
在search模块的pom文件中添加相应的依赖。
配置如下:
xml
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.13.0</version>
</dependency>
2,创建客户端
创建一个 RestHighLevelClient
实例,指定连接信息(如主机名、端口等),通过配置类将其注入到Spring容器中。
dart
@Configuration
public class GulimallElasticSearchConfig {
@Bean
public RestHighLevelClient esRestClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("192.168.56.10", 9200, "http")));
return client;
}
}
3,单元测试
通过如下单元测试,测试客户端实例能否正常注入到容器,如果能,说明整合成功。
dart
@SpringBootTest
@RunWith(SpringRunner.class)
class GulimallSearchApplicationTests {
@Autowired
private RestHighLevelClient restHighLevelClient;
@Test
public void contextLoads() {
}
@Test
public void restHighLevelClient() {
System.out.println(restHighLevelClient);
}
}
如下,单元测试通过,说明整合Elasticsearch客户成功。
整合问题记录
运行单元测试报错,如下。
dart
19:51:11.026 ERROR [ main] SpringApplication - Application startup failed
java.lang.ClassNotFoundException: org.elasticsearch.common.CheckedConsumer
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) [1 skipped]
at com.glassdoor.applicantManagement.aws.AwsAmsElasticsearchClientConfig.getElastics
原因是缺少Elasticsearch的依赖包,把下面两个全部加上。
dart
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.13.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.13.3</version>
</dependency>