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

news2024/11/5 9:12:06

更多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 {

    @Bean
    public 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 {
    @Resource
    private 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 {

    @Resource
    private ElasticsearchProperties elasticsearchProperties;

    @Bean
    public 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 {

    @Resource
    private 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 {

    @Id
    private 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 {

    @Resource
    private 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.coloradmin.cn/o/2231488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划应该如何学习?

动态规划如何学习 参考灵神的视频和题解做的笔记&#xff08;灵神YYDS&#xff0c;以后也都会用这套逻辑去思考&#xff09; 枚举选哪个&#xff1a; 动态规划入门&#xff1a;从记忆化搜索到递推_哔哩哔哩_bilibili 746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&a…

从零开始构建 ChatGPT

今天&#xff0c;我们要介绍的是一个名为 LLMs-from-scratch 的 GitHub 项目&#xff0c;它由开发者 rasbt 精心打造&#xff0c;旨在一步步教你如何使用 PyTorch 从零开始实现一个类似 ChatGPT 的大型语言模型&#xff08;LLM&#xff09;。 这是一个教育性质的开源项目&…

音视频听译:助力多维度沟通与发展的大门

在全球经济一体化的大背景下&#xff0c;企业之间的跨国合作愈发频繁。在商务会议、谈判和产品演示等活动中&#xff0c;语言的多样性成为了一大挑战。而音视频听译服务能够将不同语言的音频准确转换为目标语言文字&#xff0c;确保信息的精准传达&#xff0c;避免因语言障碍引…

向量模型Jina Embedding: 从v1到v3论文笔记

文章目录 Jina Embedding: 从v1到v3Jina Embedding v1数据集准备训练过程 Jina Embedding v2预训练修改版BERT在文本对上微调在Hard Negatives上微调 Jina Embedding v2 双语言预训练修改版BERT在文本对上微调用多任务目标微调 Jina Embedding v3预训练在文本对上微调训练任务相…

为啥学习数据结构和算法

基础知识就像是一座大楼的地基&#xff0c;它决定了我们的技术高度。而要想快速做出点事情&#xff0c;前提条件一定是基础能力过硬&#xff0c;“内功”要到位。 想要通关大厂面试&#xff0c;千万别让数据结构和算法拖了后腿 我们学任何知识都是为了“用”的&#xff0c;是为…

AI打造超写实虚拟人物:是科技奇迹还是伦理挑战?

内容概要 在这个科技飞速发展的时代&#xff0c;超写实虚拟人物仿佛从科幻小说中走进了我们的日常生活。它们以生动的形象和细腻的动作&#xff0c;不仅在影视、广告和游戏中吸引了无数目光&#xff0c;更让我们对AI技术的未来充满了期待和疑惑。这些数字化身在逼真的外貌下&a…

React基础大全

文章目录 一、React基本介绍1.虚拟DOM优化1.1 原生JS渲染页面1.2 React渲染页面 2.需要提前掌握的JS知识 二、入门1.React基本使用2.创建DOM的两种方式2.1 使用js创建&#xff08;一般不用&#xff09;2.2 使用jsx创建 3.React JSX3.1 JSX常见语法规则3.2 for循环渲染数据 4.模…

20241102在荣品PRO-RK3566开发板使用荣品预编译的buildroot通过iperf2测试AP6256的WIFI网速

20241102在荣品PRO-RK3566开发板使用荣品预编译的buildroot通过iperf2测试AP6256的WIFI网速 2024/11/2 14:18 客户端&#xff1a;荣耀手机HONOR 70【iPerf2 for Android】 服务器端&#xff1a;荣品PRO-RK3566开发板 预编译固件&#xff1a;update-pro-rk3566-buildroot-hdmi-2…

【启程Golang之旅】并发编程构建简易聊天系统

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

【JavaSE】java对象的比较

文章目录 元素的比较基本类型的比较对象的比较 如何进行对象比较重写equals方法基于Comparble.compareTo的比较基于Comparator.compare的比较区分Comparator和Comparable 在PriorityQueue中比较的体现 元素的比较 基本类型的比较 在Java中,基本类型可以直接进行大小的比较 //…

多SpringBoot项目同进程下统一启动

1.背景 使用SpringBoot技术栈进行REST HTTP接口开发服务时&#xff0c;一般来说如果模块较多或者涉及多人协作开发&#xff0c;大家会不自觉的将每个模块独立成一个单独的项目进行开发&#xff0c;部署时则将每个服务进行单独部署和运行。服务间的调用则通过FeignClients&…

lvgl

lvgl 目录 lvgl Lvgl移植到STM32 -- 1、下载LVGL源码 -- 2、将必要文件复制到工程目录 -- 3、修改配置文件 将lvgl与底层屏幕结合到一块 -- lvgl也需要有定时器,专门给自己做了一个函数,告诉lvgl经过了多长时间(ms(毫秒)级别) 编写代码 lvgl的中文教程手册网站…

使用WebAssembly优化Web应用性能

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用WebAssembly优化Web应用性能 引言 WebAssembly 简介 安装工具 创建 WebAssembly 项目 编写 WebAssembly 代码 编译 WebAssem…

【docker】docker 环境配置及安装

本文介绍基于 官方存储库 docker 的环境配置、安装、代理配置、卸载等相关内容。 官方安装文档说明&#xff1a;https://docs.docker.com/engine/install/ubuntu/ 主机环境 宿主机环境 Ubuntu 20.04.6 LTS 安装步骤 添加相关依赖 sudo apt-get update sudo apt-get install…

【Linux】网络编程:初识协议,序列化与反序列化——基于json串实现,网络通信计算器中简单协议的实现、手写序列化与反序列化

目录 一、什么是协议&#xff1f; 二、为什么需要有协议呢&#xff1f; 三、协议的应用 四、序列化与反序列化的引入 什么是序列化和反序列化&#xff1f; 为什么需要序列化和反序列化&#xff1f; 五、序列化推荐格式之一&#xff1a;JSON介绍 六、网络版计算器编程逻…

基于MATLAB的加噪语音信号的滤波

一&#xff0e;滤波器的简述 在MATLAB环境下IIR数字滤波器和FIR数字滤波器的设计方 法即实现方法&#xff0c;并进行图形用户界面设计&#xff0c;以显示所介绍迷你滤波器的设计特性。 在无线脉冲响应&#xff08;IIR&#xff09;数字滤波器设计中&#xff0c;先进行模拟滤波器…

Java项目实战II基于Spring Boot的智能家居系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着物联网技术的快速发展和普及&#…

基于Spring Boot+Vue的助农销售平台(协同过滤算法、限流算法、支付宝沙盒支付、实时聊天、图形化分析)

&#x1f388;系统亮点&#xff1a;协同过滤算法、节流算法、支付宝沙盒支付、图形化分析、实时聊天&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk1…

【C++笔记】容器适配器及deque和仿函数

【C笔记】容器适配器及deque和仿函数 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】容器适配器及deque和仿函数前言一.容器适配器1.1什么是容器适配器1.2 STL标准库中stack和queue的底层结构 二.stack2.1stack类模…

软考:中间件

中间件 中间件是一类位于操作系统软件与用户应用软件之间的计算机软件&#xff0c;它包括一组服务&#xff0c;以便于运行在一台或多台机器上的多个软件通过网络进行交互。 中间件的主要功能包括通信支持和应用支持。 通信支持为应用软件提供平台化的运行环境&#xff0c;屏蔽…