0


重学SpringBoot3-整合 Elasticsearch 8.x (一)客户端方式

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-整合 Elasticsearch 8.x (一)客户端方式

Elasticsearch 8.x 提供了更丰富的数据搜索和分析功能。随着 Spring Boot 3 的发布,如何将其与Elasticsearch 8.x 版本整合,成为了开发者关注的重点。本文将详细介绍 Spring Boot 3 如何整合 Elasticsearch 8.x 以及常见的客户端配置方式,以帮助大家顺利集成和配置 Elasticsearch 服务。

1. 为什么选择 Elasticsearch?

Elasticsearch 是一个分布式、RESTful 风格的搜索引擎,以其快速的全文检索、强大的数据分析和分布式架构而备受欢迎。常用于日志分析、实时数据分析、推荐系统等场景。

2. Spring Boot 3 和 Elasticsearch 8.x 的集成概述

Spring Boot 3 中推荐使用 Spring Data Elasticsearch 提供的客户端来访问 Elasticsearch,而不再使用低层次的 Transport Client。Elasticsearch 8.x 推出后,官方推荐使用 Java REST Client 和 ElasticsearchClient,Spring Data Elasticsearch 也支持这些新的客户端。

2.1 准备工作

在开始之前,请确保已安装并启动 Elasticsearch 8.x 实例,为了演示,本人通过 1panel 快速搭建一个演示版本的 ElasticSearch 8.x 版本。

image-20241103101755835

默认用户名:elastic

image-20241103102214279

2.2 添加依赖

pom.xml

文件中添加 Spring Data Elasticsearch 以及 Elasticsearch 客户端的依赖项:

image-20241103110103468

3. Elasticsearch 客户端配置方式

在 Spring Boot 3 中有几种方式可以连接 Elasticsearch 8.x。以下是常用的几种配置方式:

  • 官方低级别的 REST 客户端(low-level REST client);
  • 官方的Java API客户端 ElasticsearchClient ;
  • Spring Data Elasticsearch 提供的 ReactiveElasticsearchClient;
  • Java High Level REST Client ,7.15.0 版本废弃;
  • Java Transport Client 7.0.0 版本废弃。

3.1 使用

RestClient

(低级客户端)

RestClient

是 Elasticsearch 官方提供的低级 REST 客户端,它更灵活,但需要手动处理请求和响应的序列化。对于不需要处理复杂业务逻辑的场景,可以选择这种方式。

官方教程:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/java-rest-low.html

依赖

<!-- 官方低级别 REST 客户端(Low-Level REST Client) --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>8.15.3</version></dependency>

特点

  • 提供直接与 Elasticsearch 进行 HTTP 请求交互的接口。
  • 适用于对请求和响应结构有细粒度控制的场景,适合自定义复杂的请求。
  • 需要手动处理序列化和反序列化。

适用场景

当需要直接控制 HTTP 请求或需要编写自定义查询时,低级别 REST 客户端是不错的选择。它适用于高灵活性和精确控制的需求场景。

配置示例

默认配置可以直接使用配置文件:

spring:elasticsearch:uris:"http://localhost:9200"socket-timeout:"10s"username:"user"password:"secret"

更详细的配置可以添加配置类进行设置:

importorg.elasticsearch.client.RestClient;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassElasticsearchConfig{@BeanpublicRestClientrestClient(){returnRestClient.builder(newHttpHost("localhost",9200,"http")).build();}}

使用示例

在 Service 层中,通过

RestClient

来操作 Elasticsearch:

packagecom.coderjia.boot318es.service;importjakarta.annotation.Resource;importorg.apache.http.entity.ContentType;importorg.apache.http.entity.StringEntity;importorg.apache.http.util.EntityUtils;importorg.elasticsearch.client.Request;importorg.elasticsearch.client.Response;importorg.elasticsearch.client.RestClient;importorg.springframework.stereotype.Service;/**
 * @author CoderJia
 * @create 2024/11/3 上午 11:28
 * @Description
 **/@ServicepublicclassMyElasticsearchService{@ResourceprivateRestClient restClient;publicvoidaddDocument(String index,String id,String jsonContent)throwsException{Request request =newRequest("PUT","/"+ index +"/_doc/"+ id);
        request.setEntity(newStringEntity(jsonContent,ContentType.APPLICATION_JSON));
        restClient.performRequest(request);}publicStringgetDocument(String index,String id)throwsException{Request request =newRequest("GET","/"+ index +"/_doc/"+ id);Response response = restClient.performRequest(request);returnEntityUtils.toString(response.getEntity());}publicvoidupdateDocument(String index,String id,String jsonContent)throwsException{Request request =newRequest("POST","/"+ index +"/_update/"+ id);StringEntity entity =newStringEntity("{\"doc\":"+ jsonContent +"}",ContentType.APPLICATION_JSON);
        request.setEntity(entity);
        restClient.performRequest(request);}publicvoiddeleteDocument(String index,String id)throwsException{Request request =newRequest("DELETE","/"+ index +"/_doc/"+ id);
        restClient.performRequest(request);}}

结果:

restClient执行结果

3.2 官方 Java API 客户端(elasticsearch-java)

官方推荐的 Java 和 ES 8.x 交互方式。

官方教程:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/index.html

依赖

<!-- 官方 Java API 客户端 --><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.15.3</version></dependency><!--JSON对象映射库--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.0</version></dependency>

特点

  • 这是 Elasticsearch 官方推荐的高层次客户端,提供对 Elasticsearch API 的完整封装。
  • 自动处理序列化和反序列化,支持更简洁的代码。
  • 兼容 Java 8+,适用于最新的 Spring Boot 3 和 Elasticsearch 8.x 版本。

适用场景:当希望高效地集成 Elasticsearch API 并且减少对请求响应的手动处理时,该客户端是最优选择,尤其适合数据处理或搜索的微服务。

配置示例

默认配置可以直接使用配置文件:

spring:elasticsearch:uris:"http://localhost:9200"socket-timeout:"10s"username:"user"password:"secret"

更详细的配置可以添加配置类进行设置:

packagecom.coderjia.boot318es.config;importco.elastic.clients.elasticsearch.ElasticsearchClient;importco.elastic.clients.json.jackson.JacksonJsonpMapper;importco.elastic.clients.transport.rest_client.RestClientTransport;importjakarta.annotation.Resource;importorg.apache.http.HttpHost;importorg.apache.http.auth.AuthScope;importorg.apache.http.auth.UsernamePasswordCredentials;importorg.apache.http.client.CredentialsProvider;importorg.apache.http.impl.client.BasicCredentialsProvider;importorg.elasticsearch.client.RestClient;importorg.springframework.boot.autoconfigure.elasticsearch.ElasticsearchProperties;importorg.springframework.context.annotation.Bean;/**
 * @author CoderJia
 * @create 2024/11/3 下午 02:31
 * @Description
 **/publicclassElasticsearchClientConfig{@ResourceprivateElasticsearchProperties elasticsearchProperties;@BeanpublicElasticsearchClientelasticsearchClient(){finalCredentialsProvider credentialsProvider =newBasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,newUsernamePasswordCredentials(elasticsearchProperties.getUsername(), elasticsearchProperties.getPassword()));RestClient restClient =RestClient.builder(HttpHost.create(elasticsearchProperties.getUris().get(0))).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
                        .setDefaultCredentialsProvider(credentialsProvider)).build();RestClientTransport transport =newRestClientTransport(restClient,newJacksonJsonpMapper());returnnewElasticsearchClient(transport);}}

使用示例

在 Service 层中,通过

RestClient

来操作 Elasticsearch:

packagecom.coderjia.boot318es.service;importco.elastic.clients.elasticsearch.ElasticsearchClient;importco.elastic.clients.elasticsearch.core.DeleteResponse;importco.elastic.clients.elasticsearch.core.GetResponse;importco.elastic.clients.elasticsearch.core.IndexResponse;importco.elastic.clients.elasticsearch.core.UpdateResponse;importcom.coderjia.boot318es.User;importjakarta.annotation.Resource;importorg.springframework.stereotype.Service;importjava.io.IOException;/**
 * @author CoderJia
 * @create 2024/11/3 下午 02:47
 * @Description
 **/@ServicepublicclassElasticsearchClientService{@ResourceprivateElasticsearchClient esClient;publicStringaddDocument(String index,User user)throwsIOException{IndexResponse response = esClient.index(i -> i
                .index(index).id(user.getId().toString()).document(user));System.out.println("Indexed with version "+ response.version());return response.id();}publicUsergetDocument(String index,String id)throwsIOException{GetResponse<User> response = esClient.get(g -> g.index(index).id(id),User.class);if(response.found()){return response.source();}else{returnnull;}}publicvoidupdateDocument(String index,User user)throwsIOException{UpdateResponse<User> response = esClient.update(u -> u
                .index(index).id(user.getId().toString()).doc(user)// 用于更新已存在文档的字段.upsert(user),// 如果文档不存在,则插入User.class);System.out.println("Updated with version "+ response.version());}publicvoiddeleteDocument(String index,String id)throwsIOException{DeleteResponse response = esClient.delete(d -> d.index(index).id(id));System.out.println("Deleted with version "+ response.version());}}

结果

ElasticsearchClient执行结果

3.3 Spring Data Elasticsearch 提供的

ElasticsearchTemplate

Spring Data Elasticsearch 提供了

ElasticsearchTemplate

作为 Elasticsearch 的操作模板,

ElasticsearchTemplate

提供了许多高层次的 API,简化了与 Elasticsearch 的交互,用户无需直接编写复杂的 Elasticsearch 查询。

依赖

<!-- Spring Data Elasticsearch 提供的 ElasticsearchClient --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>

特点

  • 简化的操作ElasticsearchTemplate 提供了许多高层次的 API,简化了与 Elasticsearch 的交互,用户无需直接编写复杂的 Elasticsearch 查询。
  • 对象映射ElasticsearchTemplate 支持将 Java 对象映射到 Elasticsearch 文档,方便在应用程序中操作对象而无需手动处理 JSON。

配置示例

application.yml

中配置 Elasticsearch 连接地址:

spring:elasticsearch:uris:"http://localhost:9200"socket-timeout:"10s"username:"user"password:"secret"

使用示例

下面是使用

ElasticsearchTemplate

实现增、删、改、查的简单示例。

数据模型

创建一个简单的文档模型类,用于存储在 Elasticsearch 索引中的数据。

importorg.springframework.data.annotation.Id;importorg.springframework.data.elasticsearch.annotations.Document;@Document(indexName ="products")publicclassProduct{@IdprivateString id;privateString name;privateString description;privatedouble price;// Getters and Setters}

使用示例

在 Service 层中使用 Repository 来完成数据存储和查询:

packagecom.coderjia.boot318es.service;importcom.coderjia.boot318es.bean.Product;importjakarta.annotation.Resource;importorg.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;importorg.springframework.stereotype.Service;/**
 * @author CoderJia
 * @create 2024/11/3 下午 04:58
 * @Description
 **/@ServicepublicclassEsTemplateService{@ResourceprivateElasticsearchTemplate elasticsearchTemplate;publicProductsaveProduct(Product product){return elasticsearchTemplate.save(product);}publicProductgetProductById(String id){return elasticsearchTemplate.get(id,Product.class);}publicProductupdateProduct(ProductProduct){return elasticsearchTemplate.save(Product);}publicvoiddeleteProduct(String id){
        elasticsearchTemplate.delete(id,Product.class);}}

结果

ElasticsearchTemplate结果

4. 总结

在 Spring Boot 3 中集成 Elasticsearch 8.x 可以通过多种方式实现,包括

RestClient

ElasticsearchClient

ElasticsearchTemplate

等不同的客户端方案。本文提供了多种整合方式的详细示例,让您能够根据需求选择合适的集成方式。希望本文能帮助您在实际项目中顺利使用 Elasticsearch 进行高效的数据存储和查询。

后面会继续介绍 Spring Data Elasticsearch Repository 的使用,像 JPA Repository 一样操作 ES,以及 ES 各种其他使用功能,敬请期待!


本文转载自: https://blog.csdn.net/u014390502/article/details/143468299
版权归原作者 CoderJia_ 所有, 如有侵权,请联系我们删除。

“重学SpringBoot3-整合 Elasticsearch 8.x (一)客户端方式”的评论:

还没有评论