SpringBoot 2.6 集成es 7.17

引言

在现代应用开发中,Elasticsearch作为一个强大的搜索引擎和分析引擎,已经成为许多项目不可或缺的一部分。Spring Boot作为Java生态中最受欢迎的微服务框架之一,其对Elasticsearch的支持自然也是开发者关注的焦点。本文将详细介绍如何在Spring Boot 2.6版本中集成Elasticsearch 7.17版本,并提供一些基本的操作指南。

基础环境

JDK 17 (SpringBoot 2.6.13 要求JDK版本为JDK17)
Elasticsearch (7.17.16)

版本探讨

springboot提供了spring-boot-starter-data-elasticsearch 可以供我们方便的集成es ,但是需要重点强调的是 几个组件间的版本兼容性 。这个可以直接参考官方文档中的版本说明
在这里插入图片描述
其他的版本 spring-data-elasticsearch 文档总目录参见 :
https://docs.spring.io/spring-data/elasticsearch/docs/
看这个文档说明 springboot 2,6.12 可使用 spring data starter 2.6.12版本 内置的 spring-data-elasticsearch 是4.3.9 看文档描述是支持的,但是实际测试过程中,会有各种各样的报错

这里直接推荐一个 可使用的spring data starter es 版本

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>2.7.18</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

名称解释

  1. 文档(Document)
    在Elasticsearch中,文档是存储数据的最小单位。它相当于关系型数据库中的一行记录。文档以JSON格式存储,可以包含多个字段,这些字段可以是简单的数据类型(如字符串、整数、布尔值)或复杂的数据类型(如嵌套对象、数组等)。

  2. 索引(Index)
    索引是一组文档的集合,类似于关系型数据库中的一个表。索引用于存储、搜索和检索文档。在Elasticsearch中,索引是有类型的,但类型的概念在Elasticsearch 6.x中已被弃用。索引可以配置不同的设置,如分片数、副本数、映射和分析器等。

  3. 映射(Mapping)
    映射定义了文档的结构,包括字段的名称、字段的数据类型和一些其他设置,如是否存储、是否索引等。映射可以在创建索引时定义,也可以在索引创建后动态添加字段。

集成

添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>2.7.18</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

添加配置

spring:
  application:
    name: xxxx
  elasticsearch:
    connection-timeout: 3s
    socketTimeout: 3s
    uris: http://xxx:30859
    # 可选则配置账号密码
    #username: sxx
    #password: xxx

添加文档 实体类

定义文档实体类,这些类对应于Elasticsearch索引中的文档。

以下是一些常用的注解和它们的用途。

  1. @Document 注解
    @Document注解用于标识一个类作为Elasticsearch文档,并指定该类的实例应该存储在哪个索引中。
import org.springframework.data.annotation.Document;

@Document(indexName = "my_index")
public class MyDocument {
    // 类成员
}

indexName:指定文档存储的索引名称。

  1. @Id 注解
    @Id注解用于标识文档的唯一标识符字段。
import org.springframework.data.annotation.Id;

public class MyDocument {
    @Id
    private String id;

    // 其他字段和方法
}

@Id:标记字段作为文档的ID。
3. @Field 注解
@Field注解用于指定字段的映射类型和名称。

import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

public class MyDocument {
    @Field(type = FieldType.Text)
    private String content;

    // 其他字段和方法
}

type:指定字段的Elasticsearch映射类型,如FieldType.Text、FieldType.Date等。
name:指定字段在Elasticsearch中的名称,默认使用Java字段名。
4. @Fields 注解
@Fields注解用于定义多个字段,通常用于复杂类型或嵌套对象。

import org.springframework.data.elasticsearch.annotations.Fields;

public class MyDocument {
    @Fields({
        @Field(name = "first_name", type = FieldType.Text),
        @Field(name = "last_name", type = FieldType.Keyword)
    })
    private Name name;

    // 其他字段和方法
}

public class Name {
    private String firstName;
    private String lastName;
}
  1. @MultiField 注解
    @MultiField注解用于创建包含多个字段的复合字段,例如,一个主字段和一个用于排序的子字段。
import org.springframework.data.elasticsearch.annotations.MultiField;
import org.springframework.data.elasticsearch.annotations.FieldType;

public class MyDocument {
    @MultiField(mainField = @Field(type = FieldType.Text), subFields = {
        @Field(name = "raw", type = FieldType.Keyword)
    })
    private String name;

    // 其他字段和方法
}
  1. @GeoPoint 注解
    @GeoPoint注解用于标记地理位置字段。
import org.springframework.data.elasticsearch.annotations.GeoPoint;
import org.springframework.data.elasticsearch.annotations.Field;

public class MyDocument {
    @GeoPoint
    @Field(type = FieldType.GeoPoint)
    private String location;

    // 其他字段和方法
}
  1. @Completion 注解
    @Completion注解用于标记Elasticsearch的完成建议字段。
import org.springframework.data.elasticsearch.annotations.Completion;

public class MyDocument {
    @Completion
    private String suggestion;

    // 其他字段和方法
}
  1. @DateTimeFormat 注解
    @DateTimeFormat注解用于指定日期字段的格式。
import org.springframework.data.elasticsearch.annotations.DateTimeField;
import org.springframework.data.elasticsearch.annotations.DateTimeFormat;
import java.time.LocalDateTime;

public class MyDocument {
    @DateTimeField(format = DateTimeFormat.ofPattern("yyyy-MM-dd HH:mm:ss"))
    private LocalDateTime timestamp;

    // 其他字段和方法
}
  1. @Version 注解
    @Version注解用于标记文档的版本字段。
import org.springframework.data.annotation.Version;

public class MyDocument {
    @Version
    private Long version;

    // 其他字段和方法
}
  1. @Score 注解
    @Score注解用于标记查询得分字段。
import org.springframework.data.elasticsearch.annotations.Score;

public class MyDocument {
    @Score
    private Double score;

    // 其他字段和方法
}

这些注解共同构成了Spring Data Elasticsearch中文档实体类的框架,允许您以声明式的方式定义文档的结构和特性。通过这些注解,您可以轻松地将Java对象映射到Elasticsearch文档,并利用Spring Data Elasticsearch提供的Repository抽象来执行CRUD操作。

/**
 * 搜索数据 索引
 *
 * @author leon
 * @date 2024-11-21 16:16:54
 */
@Document(indexName = "search_data_index")
@Data
public class SearchDataDoc {

    /**
     * id 标识
     */
    @Id
    private Long id;
    
    /**
     * 名称
     */
    private String name;

    /**
     * 备注
     */
    private String remark;

    /**
     * 创建时间
     */
    @Field(type = FieldType.Date)
    private Date createdTime;

    /**
     * 修改时间
     */
    @Field(type = FieldType.Date)
    private Date modifiedTime;

}

定义操作文档的 CURD 仓库类

@Repository
public interface SearchDataDocRepository extends ElasticsearchRepository<SearchDataDoc, Long> {
}

实际使用

主要会使用到两种 第一个是 ElasticsearchOperations 引入spring data es starter 直接注入即可使用

ElasticsearchOperations 是 Spring Data Elasticsearch 提供的一个核心接口,它封装了与 Elasticsearch 交互的常用操作。这个接口继承自 ElasticsearchOperations,提供了一组丰富的方法,允许你在应用程序中执行各种 Elasticsearch 查询和操作。以下是 ElasticsearchOperations 接口的一些关键功能:
1.索引管理
createIndex(String indexName):创建一个新的索引。
deleteIndex(String indexName):删除一个索引。
indexExists(String indexName):检查索引是否存在。
2.文档操作
index(String indexName, String documentId, String documentSource):向指定索引添加或更新文档。
get(String indexName, String documentId, Class clazz):根据 ID 获取文档。
delete(String indexName, String documentId):根据 ID 删除文档。
3.查询执行
query(String query, Class clazz):执行一个 Elasticsearch 查询,并返回结果集。
query(String query, String indexName, Class clazz):在指定索引上执行查询。
4.批量操作
bulkIndex(List queries):执行批量索引操作。
bulkDelete(List queries):执行批量删除操作。
5.搜索和聚合
search(String query, String indexName, Class clazz):在指定索引上执行搜索查询。
searchAggregations(String query, String indexName, Class clazz):执行聚合查询。
6.更新文档
update(String indexName, String documentId, String scriptSource):使用脚本更新文档。
7.索引别名管理
createAlias(String aliasName, String indexName):创建索引别名。
deleteAlias(String aliasName):删除索引别名。
8.索引刷新和优化
refreshIndex(String indexName):刷新索引,使最近的更改对搜索可见。
optimizeIndex(String indexName):优化索引,合并分片中的段。
9.健康检查和状态查询
clusterHealth():获取集群健康状态。
indexStatus(String indexName):获取索引状态。

第二种是文档类对应的操作类型 例如 本文中 文档类是 SearchDataDoc 对应的仓库类为 SearchDataDocRepository

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SearchDataServiceTest {

    @Autowired
    private ElasticsearchOperations operations;

    @Autowired
    private SearchDataDocRepository searchDataDocRepository;

    
    @Test
    public void insert() {
        SearchDataDoc searchDataDoc = new SearchDataDoc();
        searchDataDoc.setId(1L);
        searchDataDoc.setName("test");
        searchDataDoc.setCreatedTime(new Date());
        searchDataDoc.setModifiedTime(new Date());
        searchDataDocRepository.save(searchDataDoc);
    }

    @Test
    public void update() {
        Optional<SearchDataDoc> opt = searchDataDocRepository.findById(1L);
        if (opt.isPresent()) {
            SearchDataDoc searchDataDoc = opt.get();
            searchDataDoc.setName("测试 的商品");
            SearchDataDoc save = searchDataDocRepository.save(searchDataDoc);
            System.out.println(save.getName());
        }
    }


    @Test
    public void delete() {
        searchDataDocRepository.deleteById(1L);
    }

    @Test
    public void operateIndex() {
        // 删除索引
        boolean delete = operations.indexOps(SearchDataDoc.class).delete();
        // 创建索引
        boolean create = operations.indexOps(SearchDataDoc.class).create();
        // 刷新
        operations.indexOps(SearchDataDoc.class).refresh();
        // 判断 索引是否存在 
        boolean exists = operations.indexOps(SearchDataDoc.class).exists();
    }
    
	@Test
    public void find() {
        // 条件查询
        CriteriaQuery criteriaQuery = new CriteriaQuery(
                new Criteria("name").in("test"));
        SearchHits<SearchDataDoc> search = operations.search(criteriaQuery, SearchDataDoc.class);
    }
}

运行测试类 完成验证


good day!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

沙箱模拟支付宝支付3--支付的实现

1 支付流程实现 演示案例 主要参考程序员青戈的视频【支付宝沙箱支付快速集成版】支付宝沙箱支付快速集成版_哔哩哔哩_bilibili 对应的源码在 alipay-demo: 使用支付宝沙箱实现支付功能 - Gitee.com 以下是完整的实现步骤 1.首先导入相关的依赖 <?xml version"1…

自行下载foremos命令

文章目录 问题描述其他小伙伴的成功解决方案&#xff0c;但对我不适用解决思路失败告终 最终解决成功解决思路解决步骤 问题描述 在kali系统终端中输入foremost&#xff0c;显示无此命令 其他小伙伴的成功解决方案&#xff0c;但对我不适用 解决思路 正常来说使用命令 apt-g…

商米电子秤服务插件

概述 SunmiScaleUTS封装商米电子秤服务模块&#xff0c;支持商米旗下S2, S2CC, S2L CC等设备&#xff0c;设备应用于超市、菜市场、水果店等,用于测量商品的重量,帮助实现快捷、准确、公正的交易等一系列商业场景。 功能说明 SDK插件下载 一. 电子秤参数 型号:S2, S2CC, …

快速将索尼手机联系人导出为 HTML 文件

我想将 Sony Xperia 手机上的联系人导出到计算机上进行备份&#xff0c;并在需要时进行编辑。这可以做到吗&#xff1f;如何做到&#xff1f;作为助手我需要下载什么工具吗&#xff1f; 当您的 Android 手机上存储了如此多的重要联系人&#xff0c;而您又不想丢失它们时&#…

linux安装redis及Python操作redis

目录 一、Redis安装 1、下载安装包 2、解压文件 3、迁移文件夹 4、编译 5、管理redis文件 6、修改配置文件 7、启动Redis 8、将redis服务交给systemd管理 二、Redis介绍 1、数据结构 ①字符串String ②列表List ③哈希Hash ④集合Set ⑤有序集合Sorted Set 2、…

聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载

聆听音乐手机版是面向广大音乐爱好者的移动应用程序&#xff0c;用户可以随时随地通过手机享受丰富的音乐资源。它提供了多种魅力功能&#xff0c;让用户在手机上畅享更舒适的音乐体验&#xff0c;每位用户都能享受精彩纷呈的收听体验。此外&#xff0c;软件还支持无损音质音乐…

在React中引入tailwind css(图文详解)

Tailwind CSS 是一个功能强大的 CSS 框架&#xff0c;旨在使开发者能够以更高效、灵活的方式创建现代、响应式的网页。与传统的 CSS 框架&#xff08;如 Bootstrap 或 Foundation&#xff09;不同&#xff0c;Tailwind 采取了“实用类”&#xff08;Utility-First&#xff09;的…

双指针算法详解

目录 一、双指针 二、双指针题目 1.移动零 解法&#xff1a; 代码&#xff1a; 2.复写零 ​编辑 解法&#xff1a; 代码&#xff1a; 边界情况处理: 3.快乐数 ​编辑 解法:快慢指针 代码&#xff1a; 4.盛水最多的容器 解法&#xff1a;&#xff08;对撞指针&#xff09;…

每天40分玩转Django:Django Celery

Django Celery 一、知识要点概览表 模块知识点掌握程度要求Celery基础配置、任务定义、任务执行深入理解异步任务任务状态、结果存储、错误处理熟练应用周期任务定时任务、Crontab、任务调度熟练应用监控管理Flower、任务监控、性能优化理解应用 二、基础配置实现 1. 安装和…

Web安全扫盲

1、建立网络思维模型的必要 1 . 我们只有知道了通信原理&#xff0c; 才能够清楚的知道数据的交换过程。 2 . 我们只有知道了网络架构&#xff0c; 才能够清楚的、准确的寻找漏洞。 2、局域网的简单通信 局域网的简单通信&#xff08;数据链路层&#xff09; 一般局域网都通…

【MATLAB APP Designer】小波阈值去噪(第一期)

代码原理及流程 小波阈值去噪是一种信号处理方法&#xff0c;用于从信号中去除噪声。这种方法基于小波变换&#xff0c;它通过将信号分解到不同的尺度和频率上来实现。其基本原理可以分为以下几个步骤&#xff1a; &#xff08;1&#xff09;小波变换&#xff1a;首先对含噪信…

CDP集群安全指南-动态数据加密

[〇]关于本文 集群的动态数据加密主要指的是加密通过网络协议传输的数据&#xff0c;防止数据在传输的过程中被窃取。由于大数据涉及的主机及服务众多。你需要更具集群的实际环境来评估需要为哪些环节实施动态加密。 这里介绍一种通过Cloudera Manager 的Auto-TLS功能来为整个…

信息安全、网络安全和数据安全的区别和联系

1. 前言 有次有朋友问我 信息安全、网络安全和数据安全&#xff0c;这三个词平时写文档时怎么用&#xff1f; 我想很多人都说不清。这次我查阅了资料&#xff0c;尽量讲清楚这三者之间的区别和联系。 2. 信息安全 2.1 定义 信息安全是指为数据处理系统建立和采用的技术和管…

vim 的基础使用

目录 一&#xff1a;vim 介绍二&#xff1a;vim 特点三&#xff1a;vim 配置四&#xff1a;vim 使用1、vim 语法格式2、vim 普通模式&#xff08;1&#xff09;保存退出&#xff08;2&#xff09;光标跳转&#xff08;3&#xff09;文本删除&#xff08;4&#xff09;文本查找&…

Unity2022接入Google广告与支付SDK、导出工程到Android Studio使用JDK17进行打包完整流程与过程中的相关错误及处理经验总结

注&#xff1a;因为本人也是第一次接入广告与支付SDK相关的操作&#xff0c;网上也查了很多教程&#xff0c;很多也都是只言片语或者缺少一些关键步骤的说明&#xff0c;导致本人也是花了很多时间与精力踩了很多的坑才搞定&#xff0c;发出来也是希望能帮助到其他人在遇到相似问…

【嵌入式硬件】直流电机驱动相关

项目场景&#xff1a; 驱动履带车&#xff08;双直流电机&#xff09;前进、后退、转弯 问题描述 电机驱动MOS管烧毁 电机驱动采用IR2104STRH1R403NL的H桥方案&#xff08;这是修改之后的图&#xff09; 原因分析&#xff1a; 1.主要原因是4路PWM没有限幅&#xff0c;修改…

数据库知识汇总1

一. 数据库系统概述 信息需要媒体&#xff08;文本、图像视频等&#xff09;表现出来才能被人类所获取&#xff0c;媒体可以转换成比特或者符号&#xff0c;这些称为数据&#xff1b; 数据/信息的特点&#xff1a;爆炸式增长、无限复制、派生&#xff1b; 数据库是指长期长期…

Dubbo扩展点加载机制

加载机制中已经存在的一些关键注解&#xff0c;如SPI、©Adaptive> ©Activateo然后介绍整个加载机制中最核心的ExtensionLoader的工作流程及实现原理。最后介绍扩展中使用的类动态编译的实 现原理。 Java SPI Java 5 中的服务提供商https://docs.oracle.com/jav…

Elasticsearch向量检索需要的数据集以及768维向量生成

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一&#xff1a;使用fromsize实现分页 快速掌握Elasticsearch检索之二&#xff1a;滚动查询(scrool)获取全量数据(golang) Elasticsearch检索之三&#xff1a;官方推荐方案search_after…

网关的主要作用

在网络安全领域&#xff0c;网关扮演着举足轻重的角色&#xff0c;它不仅是网络间的桥梁&#xff0c;更是安全防线的守护者。以下是网关在网络安全中的几个关键作用&#xff1a; 1. 防火墙功能&#xff1a;网关常常集成了防火墙技术&#xff0c;能够对进出网络的数据包进行严格…