当前位置: 首页 > news >正文

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: xxxxelasticsearch:connection-timeout: 3ssocketTimeout: 3suris: 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 {@Idprivate 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 {@Completionprivate 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 {@Versionprivate Long version;// 其他字段和方法
}
  1. @Score 注解
    @Score注解用于标记查询得分字段。
import org.springframework.data.elasticsearch.annotations.Score;public class MyDocument {@Scoreprivate 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 标识*/@Idprivate 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 {@Autowiredprivate ElasticsearchOperations operations;@Autowiredprivate SearchDataDocRepository searchDataDocRepository;@Testpublic void insert() {SearchDataDoc searchDataDoc = new SearchDataDoc();searchDataDoc.setId(1L);searchDataDoc.setName("test");searchDataDoc.setCreatedTime(new Date());searchDataDoc.setModifiedTime(new Date());searchDataDocRepository.save(searchDataDoc);}@Testpublic 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());}}@Testpublic void delete() {searchDataDocRepository.deleteById(1L);}@Testpublic 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();}@Testpublic void find() {// 条件查询CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("name").in("test"));SearchHits<SearchDataDoc> search = operations.search(criteriaQuery, SearchDataDoc.class);}
}

运行测试类 完成验证


good day!!!

相关文章:

SpringBoot 2.6 集成es 7.17

引言 在现代应用开发中&#xff0c;Elasticsearch作为一个强大的搜索引擎和分析引擎&#xff0c;已经成为许多项目不可或缺的一部分。Spring Boot作为Java生态中最受欢迎的微服务框架之一&#xff0c;其对Elasticsearch的支持自然也是开发者关注的焦点。本文将详细介绍如何在S…...

加固服务器有什么用?

为什么越来越多的企业和个人都在加固他们的服务器&#xff1f;加固服务器不仅可以保护数据安全&#xff0c;还能提升整体系统的稳定性和可靠性。下面是聚名网的一些介绍。 加固服务器的首要目的就是提高安全性。随着网络攻击手段的不断演变&#xff0c;黑客和恶意软件的威胁也…...

Personal APP

1、Matlab 2023b https://www.bilibili.com/opus/887246540317392920 https://blog.csdn.net/qq_25719943/article/details/138096918 https://www.jokerdown.com/22886.html 2、 3、...

探索最新的编程技术趋势:AI 编程助手和未来的编程方式

随着技术的飞速发展&#xff0c;编程技术领域在近年来经历了深刻的变革。从人工智能到低代码开发工具&#xff0c;新的技术趋势不断涌现&#xff0c;不仅大幅提高了开发效率&#xff0c;也重新定义了开发者的角色和工作方式。本篇博客将探讨几项当前最值得关注的编程技术&#…...

Android:文件管理:打开文件意图

三步走&#xff1a; 一、先在AndroidManifest.xml声明provider&#xff1a; <providerandroid:name"androidx.core.content.FileProvider"android:authorities"${applicationId}.FileProvider"android:exported"false"android:grantUriPermi…...

从纯虚类到普通类:提升C++ ABI兼容性的策略

在C编程中&#xff0c;纯虚类&#xff08;也被称为抽象类&#xff09;通常用于定义接口&#xff0c;而普通类则包含具体的实现。然而&#xff0c;在某些情况下&#xff0c;将纯虚类转换为普通类并提供默认实现&#xff0c;可以显著提升应用程序二进制接口&#xff08;ABI&#…...

QT中如何限制 限制QLineEdit只能输入字母,或数字,或某个范围内数字等限制约束?

在 Qt 中&#xff0c;你可以通过多种方式来限制 QLineEdit 只能输入特定类型的字符&#xff0c;如字母、数字或某个范围内的数字。以下是一些常见的方法&#xff1a; 1. 使用输入验证器&#xff08;QIntValidator, QDoubleValidator, QRegExpValidator&#xff09; Qt 提供了…...

Tailwind CSS 使用简介

参考网站安装 - Tailwind CSS 中文网 号称是开始使用 Tailwind CSS 通过 npm 安装 tailwindcss&#xff0c;并创建你的 tailwind.config.js 文件。 npm install -D tailwindcss npx tailwindcss init 在 tailwind.config.js 文件中添加所有模板文件的路径。 /** type {im…...

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer 一、Cocoa Touch Layer 简介二、Cocoa Touch Layer 的核心功能1. UIKit2. Event Handling&#xff08;事件处理&#xff09;3. Multitasking&#xff08;多任务处理&#xff09;4. Push Notifications&#xff08;推送通知&…...

C语言实现库函数strlen

size_t是 unsigned int fgets会读入\n&#xff0c;用strcspn函数除去 assert判读指针是否为空指针&#xff0c;使用前要引头文件<assert.h> #include <stdio.h> #include <assert.h> size_t mystrlen(const char* str) {assert(str);size_t count 0;while …...

050_小驰私房菜_MTK Camera debug, data rate 、mipi_pixel_rate 确认

mipi_pixel_rate = data rate * 4 / 10 (4 是表示4lane,10表示raw数据是10bit) mipi_pixel_rate 信息,我们可以通过 sentest命令打印看到: 下面的信息我们可以看到,mipi_pixel_rate = 501.357739Mpps,mipi rate = 10000000,是对应的我们驱动文件里面配置写的mipi_pixel_r…...

(六)vForm 动态表单(数据量大,下拉选卡顿问题)

系列文章目录 (一)vForm 动态表单设计器之使用 (二)vForm 动态表单设计器之下拉、选择 (三)vForm 动态表单解决下拉框无数据显示id问题 (四)vForm 动态表单自定义组件、属性 (五)vForm 动态表单文件上传、下载 文章目录 目录 前言 一、组件改造 1.添加分页所需参…...

【mybatis-plus问题集锦系列】mybatis使用xml配置文件实现数据的基础增删改查

简单的数据查询&#xff0c;我们可以在mapper接口里面去实现&#xff0c;但是如果是复杂的查询&#xff0c;我们就可以使用xml配置文件去做&#xff0c; 官网链接xml配置文件 实现效果 实现代码 根据mapper接口的包结构&#xff0c;在resources包里面新建同名同结构的xml文件…...

投稿指南【NO.12_14】【极易投中】期刊投稿(毛纺科技)

近期有不少同学咨询投稿期刊的问题&#xff0c;大部分院校的研究生都有发学术论文的要求&#xff0c;少部分要求高的甚至需要SCI或者多篇核心期刊论文才可以毕业&#xff0c;但是核心期刊要求论文质量高且审稿周期长&#xff0c;所以本博客梳理一些计算机特别是人工智能相关的期…...

机器学习算法的分类

一、按学习方式分类 1.监督学习&#xff08;Supervised Learning&#xff09; &#xff08;1&#xff09;定义&#xff1a;使用已标记的数据进行训练&#xff0c;每个输入数据都有对应的输出标签。模型学习输入与输出之间的映射关系。 按以上可以分为以下两种&#xff1a; …...

Linux操作系统下,挂ILA

一、在linux下安装vivado2018.3 参考视频&#xff1a;Linux下vivado安装教程_哔哩哔哩_bilibili 复制安装包进入虚拟机 安装包链接&#xff1a;https://pan.quark.cn/s/ca1a15d446fa 我的vmware tools无法使用&#xff0c;不能直接拖进虚拟机&#xff0c;所以使用了U盘复制…...

HTML——26.像素单位

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>像素</title></head><body><!--像素&#xff1a;1.指设备屏幕上的一个点&#xff0c;单位px&#xff0c;如led屏上的小灯朱2.当屏幕分辨率固定时&…...

【HTML】Day02

【HTML】Day02 1. 列表标签1.1 无序列表1.2 有序列表1.3 定义列表 2. 表格标签2.1 合并单元格 3. 表单标签3.1 input标签基本使用3.2 上传多个文件 4. 下拉菜单、文本域5. label标签6. 按钮button7. div与span、字符实体字符实体 1. 列表标签 作用&#xff1a;布局内容排列整齐…...

AI 自动化编程对编程教育的影响

AI 自动化编程的未来 引言 你是否曾想过&#xff0c;未来的程序员需要掌握哪些技能呢&#xff1f;随着人工智能的迅猛发展&#xff0c;特别是生成式AI工具的普及&#xff0c;编程的世界正在发生翻天覆地的变化。编程教育也在这种环境下进行着深刻的转型。那么&#xff0c;AI …...

Java100道面试题

1.JVM内存结构 VM内存结构指的是JVM运行时数据区结构&#xff0c;它主要包含以下几个部分&#xff1a; 堆&#xff08;Heap&#xff09;&#xff1a;线程共享。 JVM堆&#xff08;Heap&#xff09;是Java虚拟机中的一块内存区域&#xff08;所有线程共享&#xff09;&#x…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard &#xff1f; Docker Switchboard 是一个轻量级的 Web 应用程序&#xff0c;用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器&#xff0c;使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...