Elasticsearch 在 Java 中最常用的客户端是什么?如何初始化一个 RestHighLevelClient?如何用 Spring Boot 快速集成 Elasticsearch?Spring Data Elasticsearch 如何定义实体类与索引的映射?
-
最常用的 Java 客户端
目前官方推荐使用新的 Java API Client (替代旧的 RestHighLevelClient),这是 Elasticsearch 官方维护的最新客户端,支持 7.17+ 版本。旧项目可能仍在使用已被废弃的 High Level REST Client。
但是国内相对而言,RestHighLevelClient还是使用比较多的,就跟jdk8一个道理。
-
初始化 Java API Client(推荐方式)
java
// 添加 Maven 依赖
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.13.4</version>
</dependency>
// 初始化客户端
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
- Spring Boot 快速集成
properties
# application.properties
spring.elasticsearch.uris=http://localhost:9200
spring.elasticsearch.connection-timeout=1s
spring.elasticsearch.socket-timeout=30s
java
@Configuration
public class ElasticsearchConfig {
@Bean
public ElasticsearchClient elasticsearchClient(RestClientBuilder restClientBuilder) {
return new ElasticsearchClient(
new RestClientTransport(restClientBuilder.build(), new JacksonJsonpMapper())
);
}
}
- 实体类映射示例
java
@Document(indexName = "products")
public class Product {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String name;
@Field(type = FieldType.Double)
private Double price;
// getters/setters
}
- Repository 接口定义
java
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
List<Product> findByName(String name);
@Query("{\"match\": {\"name\": \"?0\"}}")
Page<Product> searchByName(String name, Pageable pageable);
}
版本注意事项:
- Spring Boot 3.x 对应 Spring Data Elasticsearch 5.x
- 需要保持 Elasticsearch 服务端版本与客户端版本一致
- 新项目建议使用新的 Java API Client,旧项目迁移参考官方迁移指南