【Elasticsearch】spring-boot-starter-data-elasticsearch的使用以及Elasticsearch集群的连接
更多有关博主写的往期Elasticsearch文章
标题 | 地址 |
---|---|
【ElasticSearch 集群】Linux安装ElasticSearch集群(图文解说详细版) | https://masiyi.blog.csdn.net/article/details/131109454 |
基于SpringBoot+ElasticSearch 的Java底层框架的实现 | https://masiyi.blog.csdn.net/article/details/121534307 |
ElasticSearch对标Mysql,谁能拔得头筹? | https://masiyi.blog.csdn.net/article/details/122661822 |
同事说关键字查询用Mysql,我上去就是一个高压锅,用ElasticSearch不香吗? | https://masiyi.blog.csdn.net/article/details/122701654 |
新年第一天,老板让升级ElasticSearch版本,我说得加钱 | https://masiyi.blog.csdn.net/article/details/122819455 |
使用了ElasticSearch之后,公司系统查询速度快了50倍,工资直接翻一倍 | https://masiyi.blog.csdn.net/article/details/122819455 |
ElasticSearch实战教程PostMan版(超级详细版) | https://masiyi.blog.csdn.net/article/details/123048119 |
Linux安装ElasticSearch以及Ik分词器(图文解说详细版) | https://masiyi.blog.csdn.net/article/details/121509681 |
文章目录
- 🐝第一步,创建一个springboot项目
- 🐝第二步,导入spring-boot-starter-data-elasticsearch依赖
- 🐝第三步,配置yml文件
- 🐝第四步,编写es索引对应的实体类
- 🐝第五步,编写实体类对应的mapper
- 🐝第六步,使用框架自带的增删改查
- 🐝增
- 🐝使用ElasticsearchRestTemplate
- 🐝使用mapper
- 🐝设置指定的id
- 🐝批量保存
- 🐝删
- 🐝传入实体类删
- 🐝传入id删
- 🐝删除索引里面所有的数据(慎用)
- 🐝改
- 🐝实体改
- 🐝实体改全部
- 🐝先查再update
- 🐝直接使用局部更新
- 🐝查
- 🐝根据id查
- 🐝根据id列表查
- 🐝查询全部数据
- 🐝排序查-正序
- 🐝排序查-倒序
- 🐝分页查
- 🐝自定义复杂的查询
- 🐝第七步,使用JPA风格的查询方式
- 🐝根据age查询
- 🐝查询所有符合age的数据
- 🐝查询最top的数据
导语
发现很多公司都是自己导入原生的jar包自己去封装一套Elasticsearch的框架,这样虽然可以自定义业务,但是需要花费很多的时间,其实spring官方有一套springboot的starter,帮助大家快速入手官网的starter,这篇博客也会介绍使用该starter连接Elasticsearch的集群。该starter有点像mybatisplus+Jpa,如果熟悉这两个框架的同学应该很快就会上手。
官网地址:
https://docs.spring.io/spring-data/elasticsearch/docs/4.0.x/reference/html/#preface
本文所有的代码都已经提交到git仓库中,仓库地址:
https://gitee.com/WangFuGui-Ma/spring-boot-elasticSearch
现在我们开始按照步骤进行spring-boot-starter-data-elasticsearch的使用,本文中使用的spring boot版本为2.7.x
对于的elasticsearch客户端版本为7.17.x
🐝第一步,创建一个springboot项目
🐝第二步,导入spring-boot-starter-data-elasticsearch依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
其他依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--json--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency><!--json-->
🐝第三步,配置yml文件
spring:elasticsearch:uris:- 192.168.75.128:9200- 192.168.75.129:9200- 192.168.75.130:9200
server:port: 8889
uris这里填的是集群的地址,如果你的es是单机版的,直接填一个就行了
🐝第四步,编写es索引对应的实体类
import lombok.Data;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.WriteTypeHint;/*** @Author masiyi* @Date 2023/6/14 13:46* @PackageName:com.masiyi.springbootstarterdataelasticsearch.doman* @ClassName: ElasticTest* @Description: TODO* @Version 1.0*/
@Data
@Document(indexName = "elastic_test",writeTypeHint = WriteTypeHint.FALSE)
public class ElasticTest {private Long id;private String name;private Integer age;private Boolean isMan;
}
注:
- id这个类型一定要写,否则会报错
- indexName对应es中的索引
- writeTypeHint如果为false则不会自动创建索引
🐝第五步,编写实体类对应的mapper
类似mybatis一样,我们需要创建对应的mapper
public interface ElasticTestMapper extends ElasticsearchRepository<ElasticTest,Long> {}
继承ElasticsearchRepository
类,第一个泛型添es对应的实体类,第二个泛型添id的类型
🐝第六步,使用框架自带的增删改查
我们这次用单元测试的方法跟大家演示框架的用法
注入刚刚创建的mapper
和框架的ElasticsearchRestTemplate
🐝增
🐝使用ElasticsearchRestTemplate
@Testvoid save() {ElasticTest elasticTest = new ElasticTest();elasticTest.setName("李四");elasticTest.setAge(23);elasticTest.setIsMan(true);elasticsearchTemplate.save(elasticTest);}
🐝使用mapper
@Testvoid insert() {ElasticTest elasticTest = new ElasticTest();elasticTest.setName("李四");elasticTest.setAge(23);elasticTest.setIsMan(true);elasticTestMapper.save(elasticTest);}
🐝设置指定的id
@Testvoid insertId() {ElasticTest elasticTest = new ElasticTest();elasticTest.setName("掉头发的王富贵");elasticTest.setAge(25);elasticTest.setIsMan(true);elasticTest.setId(2434235L);elasticTestMapper.save(elasticTest);}
🐝批量保存
@Testvoid saveAll() {ElasticTest elasticTest = new ElasticTest();elasticTest.setName("李四");elasticTest.setAge(24);elasticTest.setIsMan(true);elasticTestMapper.saveAll(Arrays.asList(elasticTest));}
🐝删
🐝传入实体类删
@Testvoid delete() {ElasticTest elasticTest = new ElasticTest();elasticTest.setId(2342342L);elasticTestMapper.delete(elasticTest);}
🐝传入id删
@Testvoid deleteById() {elasticTestMapper.deleteById(2342342L);}
🐝删除索引里面所有的数据(慎用)
@Testvoid deleteAll() {elasticTestMapper.deleteAll();}
🐝改
🐝实体改
@Testvoid update() {ElasticTest elasticTest = new ElasticTest();elasticTest.setName("掉头发的王富贵hh");elasticTest.setId(2434235L);elasticTestMapper.save(elasticTest);}
这里改会把其他的不在实体里面为null的数据清空
🐝实体改全部
@Testvoid updateAll() {ElasticTest elasticTest = new ElasticTest();elasticTest.setName("掉头发的王富贵");elasticTest.setAge(24);elasticTest.setIsMan(true);elasticTest.setId(2434234L);elasticTestMapper.save(elasticTest);}
如果我们只需要局部更新,可以使用下面的两种方法
🐝先查再update
@Testvoid updateNow() {ElasticTest elasticTest = elasticTestMapper.findById(2434234L).get();elasticTest.setName("不掉头发的王富贵");elasticTestMapper.save(elasticTest);}
但是这个方法会消耗性能,所以推荐用下面的方法
🐝直接使用局部更新
@Testvoid updateNow2() {ElasticTest elasticTest = new ElasticTest();elasticTest.setName("掉头发的王富贵h");Map map = JSONObject.parseObject(JSONObject.toJSONString(elasticTest), Map.class);UpdateQuery updateQuery = UpdateQuery.builder("0ZUv7okBcQy9f7u_tXkH").withDocument(Document.from(map)).build();elasticsearchTemplate.update(updateQuery, IndexCoordinates.of("elastic_test"));}
🐝查
🐝根据id查
@Testvoid select() {Optional<ElasticTest> byId = elasticTestMapper.findById(2434234L);byId.ifPresent(System.out::println);}
🐝根据id列表查
@Testvoid findAllById() {Iterable<ElasticTest> allById = elasticTestMapper.findAllById(Arrays.asList(2434234L));allById.forEach(System.out::println);}
🐝查询全部数据
@Testvoid findAll() {Iterable<ElasticTest> allById = elasticTestMapper.findAll();allById.forEach(System.out::println);}
🐝排序查-正序
@Testvoid findAllSort() {Sort age = Sort.by("age").ascending();Iterable<ElasticTest> all = elasticTestMapper.findAll(age);all.forEach(System.out::println);}
🐝排序查-倒序
@Testvoid findAllSortDE() {Sort age = Sort.by("age").descending();Iterable<ElasticTest> all = elasticTestMapper.findAll(age);all.forEach(System.out::println);}
🐝分页查
@Testvoid findAllPage() {PageRequest pageRequest = PageRequest.of(0, 10);Page<ElasticTest> all = elasticTestMapper.findAll(pageRequest);all.forEach(System.out::println);System.out.println(JSON.toJSONString(all));}
🐝自定义复杂的查询
@Testvoid findMyStyle() {TermQueryBuilder termQueryBuilder = new TermQueryBuilder("name.keyword", "掉头发的王富贵");NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(termQueryBuilder);SearchHits<ElasticTest> search = elasticsearchTemplate.search(nativeSearchQuery, ElasticTest.class);List<SearchHit<ElasticTest>> hitList = search.getSearchHits();for (SearchHit<ElasticTest> hit : hitList) {ElasticTest entity = hit.getContent(); // 获取实体对象System.out.println(entity);String index = hit.getIndex(); // 获取索引名System.out.println(index);}}
🐝第七步,使用JPA风格的查询方式
如果会用jpa的同学看到这个可能会非常得熟悉
可以自定义查询方法find...
🐝根据age查询
ElasticTest findByAge(Integer age);
🐝查询所有符合age的数据
List<ElasticTest> findAllByAge(Integer age);
🐝查询最top的数据
ElasticTest findTopByAge(Integer age);
如果你使用的是idea这种高级的编辑器,你在mapper写方法的时候会自动提示你。
通过本文的学习,我们探索了在Spring Boot应用中使用Elasticsearch的方法以及如何连接到Elasticsearch集群。Elasticsearch作为一款强大的搜索和分析引擎,在现代应用开发中扮演着至关重要的角色。借助于Spring Boot和spring-boot-starter-data-elasticsearch,我们能够以更加便捷的方式将Elasticsearch集成到我们的项目中,实现高效的数据搜索与分析。
通过配置简单明了的属性,我们能够快速地将Spring Boot应用连接到Elasticsearch集群,实现数据的索引、搜索和分析。借助于Spring Data Elasticsearch提供的强大功能,我们能够轻松地定义实体类、进行CRUD操作,并且利用Elasticsearch的全文搜索和分词等特性,让我们的应用具备更高效的查询和检索能力。
相关文章:
【Elasticsearch】spring-boot-starter-data-elasticsearch的使用以及Elasticsearch集群的连接
更多有关博主写的往期Elasticsearch文章 标题地址【ElasticSearch 集群】Linux安装ElasticSearch集群(图文解说详细版)https://masiyi.blog.csdn.net/article/details/131109454基于SpringBootElasticSearch 的Java底层框架的实现https://masiyi.blog.c…...
Python学习笔记_进阶篇(四)_django知识(三)
本章内容: Django 发送邮件Django cookieDjango sessionDjango CSRF Django 发送邮件 我们常常会用到一些发送邮件的功能,比如有人提交了应聘的表单,可以向HR的邮箱发邮件,这样,HR不看网站就可以知道有人在网站上提…...
指针(初阶)
1. 指针是什么? 指针是什么? 指针理解的2个要点: 1. 指针是内存中一个最小单元的编号,也就是地址 2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量 总结:指针就是地址&…...
Flink内核源码解析--Flink中重要的工作组件和机制
Flink内核源码 1、掌握Flink应用程序抽象2、掌握Flink核心组件整体架构抽象3、掌握Flink Job三种运行模式4、理解Flink RPC网络通信框架Akka详解5、理解TaskManager为例子,分析Flink封装Akka Actor的方法和整个调用流程6、理解Flink高可用服务HighAvailabilityServ…...
Linux 压缩解压(归档管理):tar命令
计算机中的数据经常需要备份,tar是Unix/Linux中最常用的备份工具,此命令可以把一系列文件归档到一个大文件中,也可以把档案文件解开以恢复数据。 tar使用格式 tar [参数] 打包文件名 文件 tar命令很特殊,其参数前面可以使用“-”&…...
spring boot集成mqtt协议发送和订阅数据
maven的pom.xml引入包 <!--mqtt--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId><version>2.3.6.RELEASE</version></dependency><dependency…...
【数据库】详解数据库架构优化思路(两主架构、主从复制、冷热分离)
文章目录 1、为什么对数据库做优化2、双主架构双主架构的工作方式如下:双主架构的优势包括:但是一般不用这种架构,原因是: 3、主从复制主从复制的工作方式如下:主从复制的优势包括:主从复制的缺点 4、冷热分…...
el-table 实现动态表头 静态内容 根据数据显示动态输入框
直接放代码了 <el-table:data"form.tableDataA"borderstripestyle"width: 100%; margin-top: 20px"><el-table-columnv-for"(category, categoryIndex) in form.tableDataA":key"categoryIndex":label"category.name&qu…...
Reids 的整合 Spring Data Redis使用
大家好 , 我是苏麟 , 今天带来强大的Redis . REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选…...
3D数据转换工具HOOPS Exchange概览
HOOPS Exchange SDK是一组C软件库,使开发团队能够快速为其应用程序添加可靠的2D和3D CAD导入和导出功能。这允许访问广泛的数据,包括边界表示(BREP)、产品制造信息(PMI)、模型树、视图、持久ID、样式、构造…...
【从零开始的rust web开发之路 一】axum学习使用
系列文章目录 第一章 axum学习使用 文章目录 系列文章目录前言老规矩先看官方文档介绍高级功能兼容性 二、hello world三、路由四,handler和提取器五,响应 前言 本职java开发,兼架构设计。空闲时间学习了rust,目前还不熟练掌握。…...
oracle警告日志\跟踪日志磁盘空间清理
oracle警告日志\跟踪日志磁盘空间清理 问题现象: 通过查看排查到alert和tarce占用大量磁盘空间 警告日志 /u01/app/oracle/diag/rdbms/orcl/orcl/alert 跟踪日志 /u01/app/oracle/diag/rdbms/orcl/orcl/trace 解决方案: 用adrci清除日志 确定目…...
【vue】el-table 数据更新后,刷新表格数据
表格里面的数据更新后,可以通过以下方法来刷新表格 方法1 用更新后的数据,覆盖之前的数据 var newTableData[];for(var i0;i<that.tableData.length;i){ if(aIdthat.selectStationId&&bIdthat.selectDeviceId){that.tableData[i].physica…...
AVL——平衡搜索树
✅<1>主页:我的代码爱吃辣📃<2>知识讲解:数据结构——AVL树☂️<3>开发环境:Visual Studio 2022💬<4>前言:AVL树是对二叉搜索树的严格高度控制,所以AVL树的搜索效率很高…...
TCP通信流程以及一些TCP的相关概念
1.TCP和UDP区别 都为传输层协议 UDP:用户数据报协议,面向无连接,可以单播,多播,广播,面向数据报,不可靠 TCP:传输控制协议,面向连接的,可靠的,基…...
PyTorch学习笔记(十七)——完整的模型验证(测试,demo)套路
完整代码: import torch import torchvision from PIL import Image from torch import nnimage_path "../imgs/dog.png" image Image.open(image_path) print(image)# 因为png格式是四个通道,除了RGB三通道外,还有一个透明度通…...
WPF开篇
一、为什么要学习WPF 大环境不好,公司要求逐年提高,既要会后端又要会客户端WPF相对于WinForm来说用户界面效果更好,图像更加立体化也是给自己增加一项技能,谨记一句话,技多不压身;多一份技能就多一份竞争力…...
linux 压缩解压缩
压缩解压缩 linux中压缩和解压文件也是很常见的 zip格式 zip格式的压缩包在windows很常见,linux中也有zip格式的压缩包 #压缩#zip [选项] 压缩包名 文件(多个文件空格隔开)zip 1.zip 123.txt 456.txt zip -r 2.zip /home/user1 ---------------------- -r 压缩目录 …...
centos9 mysql8修改数据库的存储路径
一、环境 系统:CentOS Stream release 9 mysql版本:mysql Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL) 二、修改mysql的数据库,存储路径 查看目录数据存储的位置 cat /etc/my.cnf操作 1、新建存放的目录,…...
【C++】<Windows编程中消息即事件的处理>
目录 一、注册窗口类,指定消息处理函数,捕获消息并发给处理函数 二、消息处理函数 三、通用窗口消息 四、其他消息 1.滚动条消息 2.按钮控件消息 3.按钮控件通知消息 4.按键消息 5.系统菜单等消息 6.组合框控件消息 7.组合框控件通知消息 8.列…...
数据库SQL语句使用
-- 查询所有数据库 show databases; -- 创建数据库,数据库名为mydatabase create database mydatabase; -- 如果没有名为 mydatabase的数据库则创建,有就不创建 create database if not exists mydatabase; -- 如果没有名为 mydatabase的数据库则创建…...
从零开始 Spring Cloud 12:Sentinel
从零开始 Spring Cloud 12:Sentinel 1.初识 Sentinel 1.1雪崩问题 1.1.1什么是雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。 如图,如果服务提供者I发生了故障,当前的应用的部分…...
@Resurce和@Autowired的区别
Resource 和 Autowired 是 Java 中常用的两个注解,用于自动装配依赖对象。它们的主要区别如下: 来源不同: Resource 是 Java EE 提供的注解,属于 J2EE 的一部分,它由 JSR-250 规范定义。 Autowired 是 Spring 框架提供…...
ResNet简介
ResNet (Residual Network) 此网络于2015年,国人何先生提出,用于解决随着深度学习的层数加深造成的网络退化现象和梯度消失、梯度爆炸。 问题1 退化现象 当深度学习的各项指标能够随着训练轮数收敛的情况下,网络的层数增强未能像理论一样&…...
了解单例模式,工厂模式(简单易懂)
文章目录 单例模式饿汉模式懒汉模式对比 工厂模式简单工厂模式(Simple Factory Pattern)工厂方法模式(Factory Method Pattern)抽象工厂模式(Abstract Factory Pattern)对比 单例模式 什么是单例ÿ…...
【中危】 Apache NiFi 连接 URL 验证绕过漏洞 (CVE-2023-40037)
漏洞描述 Apache NiFi 是一个开源的数据流处理和自动化工具。 在受影响版本中,由于多个Processors和Controller Services在配置JDBC和JNDI JMS连接时对URL参数过滤不完全。使用startsWith方法过滤用户输入URL,导致过滤可以被绕过。攻击者可以通过构造特…...
【Git版本控制工具使用---讲解一】
Git版本控制工具使用 安装设置用户名签名和邮箱Git常用的命令 初始化本地库查看本地状态Git 命令添加暂存区提交本地库查看版本信息修改文件版本穿梭 安装 首先根据自身电脑的配置选择性的安装是32位的还是64位的Git版本控制工具 我这边安装的是64位的 以下是我安装的时候的过…...
NLP | 基于LLMs的文本分类任务
比赛链接:讯飞开放平台 来源:DataWhale AI夏令营3(NLP) Roberta-base(BERT的改进) ①Roberta在预训练的阶段中没有对下一句话进行预测(NSP) ②采用了动态掩码 ③使用字符级和词级…...
攻防世界-base÷4
原题 解题思路 base644,莫不是base16,base16解码网站: 千千秀字...
【Java转Go】快速上手学习笔记(三)之基础篇二
【Java转Go】快速上手学习笔记(二)之基础篇一 了解了基本语法、基本数据类型这些使用,接下来我们来讲数组、切片、值传递、引用传递、指针类型、函数、map、结构体。 目录 数组和切片值传递、引用传递指针类型defer延迟执行函数map结构体匿名…...
邯郸网站网站建设/东莞seo网络优化
localStorage 生命周期是永久的 这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。sessionStorage 生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也…...
做视频网站需要多大带宽/成都seo排名
https://chart.googleapis.com/chart?chtqr&chs150x150&choeUTF-8&chldL|4&chl%E8%BF%99%E9%87%8C%E6%89%93%E6%96%87%E5%AD%97 chl为需要生成的文字转载于:https://www.cnblogs.com/sxmny/archive/2012/11/18/2776383.html...
洛阳网站建设价格低/宁波建站模板系统
两种科学的碰撞,经常会带起一大片脑洞。而当自然科学与某种人文科学相遇,脑洞的连锁反应格外强烈。比如说,天文学和考古。按理说这俩东西应该谁也不挨着谁。天文学家总是抬头仰望星空,而考古学家始终凝视着大地——这属于颈椎病高…...
广东两学一做考试网站/视频运营管理平台
JS中的数据类型 虽然JS是弱类型语言,JS的变量声明的时候并不需要指定数据类型,但是在赋值上每一个数据是由类型的。 值得注意的是ES6之后,又基于以下的6中类型之外添加了一种新的类型:symbol 学习数据类型我们还常用typeof运算符…...
网站设计数据库怎么做/刷赞网站推广免费链接
命令1 & 命令2 & 命令3 ... (无论前面命令是否故障,照样执行后面) 命令1 && 命令2 && 命令3.... (仅当前面命令成功时,才执行后面) 命令1 || 命令2 || 命令3.... (仅当前面命令失败时.才执行后面)1、start 用来启动一…...
辽宁高速公路建设管理局网站/网络营销图片
我是AY,杨洋,做wpf开发的,最近得了一种病,程序员患得患失综合征。同事说,我年纪在变大,技术跟不上。业余之间,我原创了写了一些语录,给大家中午休息,累疲惫的时候&#x…...