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

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

这里写目录标题

  • 1. 为什么选择 Elasticsearch?
  • 2. Spring Boot 3 和 Elasticsearch 8.x 的集成概述
    • 2.1 准备工作
    • 2.2 添加依赖
  • 3. Elasticsearch 客户端配置方式
    • 3.1 使用 `RestClient` (低级客户端)
    • 3.2 官方 Java API 客户端(elasticsearch-java)
    • 3.3 Spring Data Elasticsearch 提供的 `ElasticsearchTemplate`
  • 4. 总结

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"

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

import org.elasticsearch.client.RestClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ElasticsearchConfig {@Beanpublic RestClient restClient() {return RestClient.builder(new HttpHost("localhost", 9200, "http")).build();}
}

使用示例

在 Service 层中,通过 RestClient 来操作 Elasticsearch:

package com.coderjia.boot318es.service;import jakarta.annotation.Resource;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import org.springframework.stereotype.Service;/*** @author CoderJia* @create 2024/11/3 上午 11:28* @Description**/
@Service
public class MyElasticsearchService {@Resourceprivate RestClient restClient;public void addDocument(String index, String id, String jsonContent) throws Exception {Request request = new Request("PUT", "/" + index + "/_doc/" + id);request.setEntity(new StringEntity(jsonContent, ContentType.APPLICATION_JSON));restClient.performRequest(request);}public String getDocument(String index, String id) throws Exception {Request request = new Request("GET", "/" + index + "/_doc/" + id);Response response = restClient.performRequest(request);return EntityUtils.toString(response.getEntity());}public void updateDocument(String index, String id, String jsonContent) throws Exception {Request request = new Request("POST", "/" + index + "/_update/" + id);StringEntity entity = new StringEntity("{\"doc\":" + jsonContent + "}", ContentType.APPLICATION_JSON);request.setEntity(entity);restClient.performRequest(request);}public void deleteDocument(String index, String id) throws Exception {Request request = new Request("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"

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

package com.coderjia.boot318es.config;import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import jakarta.annotation.Resource;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchProperties;
import org.springframework.context.annotation.Bean;/*** @author CoderJia* @create 2024/11/3 下午 02:31* @Description**/
public class ElasticsearchClientConfig {@Resourceprivate ElasticsearchProperties elasticsearchProperties;@Beanpublic ElasticsearchClient elasticsearchClient() {final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(elasticsearchProperties.getUsername(), elasticsearchProperties.getPassword()));RestClient restClient = RestClient.builder(HttpHost.create(elasticsearchProperties.getUris().get(0))).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)).build();RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());return new ElasticsearchClient(transport);}
}

使用示例

在 Service 层中,通过 RestClient 来操作 Elasticsearch:

package com.coderjia.boot318es.service;import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.DeleteResponse;
import co.elastic.clients.elasticsearch.core.GetResponse;
import co.elastic.clients.elasticsearch.core.IndexResponse;
import co.elastic.clients.elasticsearch.core.UpdateResponse;
import com.coderjia.boot318es.User;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;import java.io.IOException;/*** @author CoderJia* @create 2024/11/3 下午 02:47* @Description**/
@Service
public class ElasticsearchClientService {@Resourceprivate ElasticsearchClient esClient;public String addDocument(String index,  User user) throws IOException {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();}public User getDocument(String index, String id) throws IOException {GetResponse<User> response = esClient.get(g -> g.index(index).id(id), User.class);if (response.found()) {return response.source();} else {return null;}}public void updateDocument(String index, User user) throws IOException {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());}public void deleteDocument(String index, String id) throws IOException {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 索引中的数据。

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;@Document(indexName = "products")
public class Product {@Idprivate String id;private String name;private String description;private double price;// Getters and Setters
}

使用示例

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

package com.coderjia.boot318es.service;import com.coderjia.boot318es.bean.Product;
import jakarta.annotation.Resource;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
import org.springframework.stereotype.Service;/*** @author CoderJia* @create 2024/11/3 下午 04:58* @Description**/
@Service
public class EsTemplateService {@Resourceprivate ElasticsearchTemplate elasticsearchTemplate;public Product saveProduct(Product product) {return elasticsearchTemplate.save(product);}public Product getProductById(String id) {return elasticsearchTemplate.get(id, Product.class);}public Product updateProduct(Product Product) {return elasticsearchTemplate.save(Product);}public void deleteProduct(String id) {elasticsearchTemplate.delete(id, Product.class);}
}

结果

ElasticsearchTemplate结果

4. 总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/463584.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBaitsPlus 基本用法简单整理

MyBaitsPlus 基本用法整理 查询单表查询查询单条数据写法一&#xff1a;&#xff08;this.getOne&#xff09;写法二&#xff1a;&#xff08;XxxMapper.selectById&#xff09;写法三&#xff1a;&#xff08;this.getById&#xff09; 查询 list 集合&#xff08;this.list&a…

基于MATLAB的战术手势识别

手势识别的研究起步于20世纪末&#xff0c;由于计算机技术的发展&#xff0c;特别是近年来虚拟现实技术的发展&#xff0c;手势识别的研究也到达一个新的高度。熵分析法是韩国的李金石、李振恩等人通过从背景复杂的视频数据中分割出人的手势形状&#xff0c;然后计算手型的质心…

Mac 配置SourceTree集成云效

1、背景 工作使用的是自己的笔记本&#xff0c;一个是比较卡&#xff0c;在一个是敏感信息比较多还是使用公司的电脑&#xff0c;但是系统是Mac就很麻烦&#xff0c;在网上找了帖子记录一下 2、配置 打开终端 ssh-keygen -t rsa #一直回车就行 cd .ssh cat id_rsa.pub #查…

【快速上手】pyspark 集群环境下的搭建(Yarn模式)

目录 前言&#xff1a; 一、安装步骤 安装前准备 1.第一步&#xff1a;安装python 2.第二步&#xff1a;在bigdata01上安装spark 3.第三步&#xff1a;同步bigdata01中的spark到bigdata02和03上 二、启动 三、可打开yarn界面查看任务 前言&#xff1a; 上一篇介绍的是…

使用Python多线程抓取某图网数据并下载图片

前言 在互联网开发领域&#xff0c;数据抓取是一项非常实用的技术。通过数据抓取&#xff0c;我们可以从网页上获取所需的信息&#xff0c;并将其转化为结构化数据&#xff0c;以便进一步分析或使用。本文将介绍如何利用Python编写一个多线程程序来抓取网页上的图片数据&#…

《IMM交互式多模型滤波MATLAB实践》专栏目录,持续更新……

专栏链接&#xff1a;https://blog.csdn.net/callmeup/category_12816762.html 专栏介绍 关于IMM的例程 双模型EKF&#xff1a; 【逐行注释】基于CV/CT模型的IMM|MATLAB程序|源代码复制后即可运行&#xff0c;无需下载三模型EKF&#xff1a; 【matlab代码】3个模型的IMM例程&…

鸿蒙开发案例:指南针

【1】引言&#xff08;完整代码在最后面&#xff09; 在本文中&#xff0c;我们将介绍如何使用鸿蒙系统&#xff08;HarmonyOS&#xff09;开发一个简单的指南针应用。通过这个案例&#xff0c;你可以学习如何使用传感器服务、状态管理以及UI构建等基本技能。 【2】环境准备 …

人工智能的发展与未来:从Yann LeCun的观点谈起

引言 在当今的人工智能&#xff08;AI&#xff09;领域&#xff0c;AGI&#xff08;通用人工智能&#xff09;已成为热门话题。许多专家认为&#xff0c;随着技术的不断发展&#xff0c;AGI的实现只是时间问题。然而&#xff0c;Yann LeCun——图灵奖得主、Meta首席AI科学家&a…

【The Art of Unit Testing 3_自学笔记06】3.4 + 3.5 单元测试核心技能之:函数式注入与模块化注入的解决方案简介

文章目录 3.4 函数式依赖注入技术 Functional injection techniques3.5 模块化依赖注入技术 Modular injection techniques 写在前面 上一篇的最后部分对第三章后续内容做了一个概括性的梳理&#xff0c;并给出了断开依赖项的最简单的实现方案&#xff0c;函数参数值注入法。本…

电磁兼容(EMC):整改案例(六)Y电容过大导致雷击浪涌炸机

目录 1. 异常现象 2. 原因分析 3. 整改方案 4. 总结 1. 异常现象 某金属外壳带接地线的产品按GB/T 17626.5进行雷击浪涌测试&#xff0c;在L&#xff0c;N线对PE进行4kV浪涌电压测试时&#xff0c;出现炸机现象&#xff0c;AC-DC电源芯片损坏。而在L&#xff0c;N线间进行2…

代码之眼,陈欣的xml解密之路

第一章 在未来的世界里&#xff0c;科技已经发展到了令人难以想象的地步。人工智能、量子计算和生物技术交织在一起&#xff0c;创造了一个全新的社会形态。在这个世界中&#xff0c;有一个名为“代码守护者”的组织&#xff0c;专门负责维护全球信息系统的安全和稳定。 陈欣是…

L0G1000:Linux+InternStudio 闯关作业

1. 配置基础环境 首先&#xff0c;打开 Intern Studio 界面&#xff0c;点击 创建开发机 配置开发机系统。 InternStudio 填写 开发机名称 后&#xff0c;点击 选择镜像 使用 Cuda11.7-conda 镜像&#xff0c;然后在资源配置中&#xff0c;使用 10% A100 * 1 的选项&#xff…

爬虫笔记22——当当网图书详情页静、动态数据爬取

当当网动态数据爬取 静态数据爬取动态数据爬取接口参数的获取 静态数据爬取 进入图书详情&#xff0c;这里的图书数据信息比如标题、价格、图片都是非结构化数据&#xff0c;可以使用xpath语法提取。是很简单的数据采集了&#xff0c;就不细说了。 动态数据爬取 滑到下面这里的…

使用pathview在线渲染KEGG Pathway Map,给感兴趣的基因、化合物添加颜色

导读&#xff1a; 通过将用户提供的基因表达定量数据&#xff0c;化合物定量数据映射并渲染到相关的KEGG通路图上&#xff0c;能够帮助我们直观且系统地研究基因、酶、化合物间的关系。 KEGG通路图简介 KEGG PATHWAY数据库是一系列手动绘制的图形图谱的集合&#xff0c;称为…

自动化测试工具Ranorex Studio(二十一)-适配一个已存在的对象库

通过录制一个手工测试场景我们创建了一个对象库。录制期间用到的每个UI元素都在库中创建了一个新的条目。默认情况下&#xff0c;一个新的Ranorex Studio项目包含一个库文件(*.rxrep)&#xff0c;这个文件可以被多个录制模块或代码模块使用。 图&#xff1a;一个库的文件视图…

OpenSLL下载,环境变量配置

https://slproweb.com/products/Win32OpenSSL.html 环境变量 新建一个path为安装选择的目录的bin路径

【MyBatis】【基于轻量型架构的WEB开发】课程 课后习题 章节测试

mybatis关联查询、缓存、注解 一. 单选题 1. 下列关于 <collection> 元素的描述正确的是&#xff08;&#xff09;。 A. MyBatis 就是通过 <collection> 元素来处理一对多关联关系的 B. <collection> 元素的属性与 <association> 元素完全相同 C.…

JavaEE-多线程上

文章目录 线程概述进程/线程多线程的作用JVM关于线程资源的规范关于Java程序的运行原理 并发与并行并发(concurrency)并行(parallellism)并发编程与并行编程 线程的调度策略分时调度模型抢占式调度模型 创建线程线程类分析入门实现线程的第一种方式实现线程的第二种方式 线程的…

SQL 常用语句

目录 我的测试环境 学习文档 进入数据库 基础通关测验 语句-- 查 展示数据库&#xff1b; 进入某个数据库&#xff1b; 展示表&#xff1a; 展示某个表 desc 查询整个表&#xff1a; 查询特定列&#xff1a; 范围查询 等于特定值 不等于 介于 特定字符查询 Li…

[MySQL]DQL语句(一)

查询语句是数据库操作中最为重要的一系列语法。查询关键字有 select、where、group、having、order by、imit。其中imit是MySQL的方言&#xff0c;只在MySQL适用。 数据库查询又分单表查询和多表查询&#xff0c;这里讲一下单表查询。 基础查询 # 查询指定列 SELECT * FROM …