Springboot3整合ES8

news/2025/1/10 10:50:44/文章来源:https://www.cnblogs.com/lwx11111/p/18663563

1.依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.0</version><relativePath/>
</parent><properties><java.version>17</java.version>
</properties><dependencies><!--spring boot and web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--spring data elasticsearch--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
</dependencies>

2.yaml

elasticsearch:uris: http://10.0.117.74:9200username: elasticpassword: hXtO*Lzi2GGJ5wUmUA2c

3.索引类

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "video")
public class VideoDTO {/*** type 对应Elasticsearch中属性类型,使用FiledType枚举快速获取。* text 类型能被分词* keywords 不能被分词* index  是否创建索引,作为搜索条件时index必须为true* analyzer 指定分词器类型。*/@Id@Field(type = FieldType.Text, index = false)private Long id;@Field(type = FieldType.Text)private String title;@Field(type = FieldType.Text)private String description;@Field(type = FieldType.Keyword)private String category;@Field(type = FieldType.Integer)private Integer duration;@Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second)private LocalDateTime createTime;public VideoDTO(Long id, String title, String description, Integer duration,String category) {this.id = id;this.title = title;this.description = description;this.duration = duration;this.createTime = LocalDateTime.now();this.category = category;}
}

4.测试类

/*** Spring Data:用于简化数据访问和持久化的开发框架,提供了一组统一的 API 和抽象* 与各种数据存储技术(如关系型数据库、NoSQL 数据库、Elasticsearch 等)进行交互变得更加容易*//*** Java API Client(8.X版本开始推荐使用):是一个用于与Elasticsearch服务器进行通信的Java客户端库*              封装了底层的Transport通信,并提供了同步和异步调用、流式和函数式调用等方法* Java REST Client: 7.1版本之前使用的Java客户端是*/
@Service
public class EsTest {@Autowiredprivate ElasticsearchTemplate restTemplate;/*** 判断索引是否存在索引*/public void existsIndex() {IndexOperations indexOperations = restTemplate.indexOps(VideoDTO.class);boolean exists = indexOperations.exists();System.out.println(exists);}/*** 创建索引*/public void createIndex() {// spring data es所有索引操作都在这个接口IndexOperations indexOperations = restTemplate.indexOps(VideoDTO.class);// 是否存在,存在则删除if(indexOperations.exists()){indexOperations.delete();}// 创建索引indexOperations.create();//设置映射: 在正式开发中,几乎不会使用框架创建索引或设置映射,这是架构或者管理员的工作,不适合使用代码实现restTemplate.indexOps(VideoDTO.class).putMapping();}/*** 删除索引*/public void deleteIndex() {IndexOperations indexOperations = restTemplate.indexOps(VideoDTO.class);boolean delete = indexOperations.delete();System.out.println(delete);}/*** 添加*/public void insert(){VideoDTO videoDTO = new VideoDTO();videoDTO.setId(1L);videoDTO.setTitle("小滴课堂架构大课和Spring Cloud");videoDTO.setCreateTime(LocalDateTime.now());videoDTO.setDuration(100);videoDTO.setCategory("后端");videoDTO.setDescription("这个是综合大型课程,包括了jvm,redis,新版spring boot3.x,架构,监控,性能优化,算法,高并发等多方面内容");VideoDTO saved = restTemplate.save(videoDTO);System.out.println(saved);}/*** 更新*/public void update(){VideoDTO videoDTO = new VideoDTO();videoDTO.setId(1L);videoDTO.setTitle("小滴课堂架构大课和Spring Cloud V2");videoDTO.setCreateTime(LocalDateTime.now());videoDTO.setDuration(102);videoDTO.setCategory("后端");videoDTO.setDescription("这个是综合大型课程,包括了jvm,redis,新版spring boot3.x,架构,监控,性能优化,算法,高并发等多方面内容");VideoDTO saved = restTemplate.save(videoDTO);System.out.println(saved);}/*** 批量添加*/public void batchInsert() {List<VideoDTO> list = new ArrayList<>();list.add(new VideoDTO(2L, "老王录制的按摩课程", "主要按摩和会所推荐", 123, "后端"));list.add(new VideoDTO(3L, "冰冰的前端性能优化", "前端高手系列", 100042, "前端"));list.add(new VideoDTO(4L, "海量数据项目大课", "D哥的后端+大数据综合课程", 5432345, "后端"));list.add(new VideoDTO(5L, "小滴课堂永久会员", "可以看海量专题课程,IT技术持续充电平台", 6542, "后端"));list.add(new VideoDTO(6L, "大钊-前端低代码平台", "高效开发底层基础平台,效能平台案例", 53422, "前端"));list.add(new VideoDTO(7L, "自动化测试平台大课", "微服务架构下的spring cloud架构大课,包括jvm,效能平台", 6542, "后端"));Iterable<VideoDTO> result = restTemplate.save(list);System.out.println(result);}/*** 主键查询*/public void  searchById(){VideoDTO videoDTO = restTemplate.get("3", VideoDTO.class);assert videoDTO != null;System.out.println(videoDTO);}/*** 删除ById*/public void deleteById() {String delete = restTemplate.delete("2", VideoDTO.class);System.out.println(delete);}/***     NativeQuery*     搜索复杂查询或无法使用CriteriaAPI 表达的查询时使用的类,例如在构建查询和使用聚合的场景*//*** 查询所有:*/public void searchAll(){SearchHits<VideoDTO> search = restTemplate.search(Query.findAll(), VideoDTO.class);List<SearchHit<VideoDTO>> searchHits = search.getSearchHits();// 获得searchHits,进行遍历得到contentList<VideoDTO> videoDTOS = new ArrayList<>();searchHits.forEach(hit -> {videoDTOS.add(hit.getContent());});System.out.println(videoDTOS);}/*** match查询*/public void matchQuery(){Query query = NativeQuery.builder().withQuery(q -> q.match(m -> m.field("description") //字段.query("spring") //值)).build();SearchHits<VideoDTO> searchHits = restTemplate.search(query, VideoDTO.class);// 获得searchHits,进行遍历得到contentList<VideoDTO> videoDTOS = new ArrayList<>();searchHits.forEach(hit -> {videoDTOS.add(hit.getContent());});System.out.println(videoDTOS);}/*** 分页查询*/public void pageSearch() {Query query = NativeQuery.builder().withQuery((co.elastic.clients.elasticsearch._types.query_dsl.Query) Query.findAll()).withPageable(Pageable.ofSize(3).withPage(0)).build();SearchHits<VideoDTO> searchHits = restTemplate.search(query, VideoDTO.class);// 获得searchHits,进行遍历得到contentList<VideoDTO> videoDTOS = new ArrayList<>();searchHits.forEach(hit -> {videoDTOS.add(hit.getContent());});System.out.println(videoDTOS);}/*** 排序查询,根据时长降序排列*/public void sortSearch() {Query query = NativeQuery.builder().withQuery((co.elastic.clients.elasticsearch._types.query_dsl.Query) Query.findAll()).withPageable(Pageable.ofSize(10).withPage(0))// descending():倒叙 ascending():默认的,正序.withSort(Sort.by("duration").descending()).build();SearchHits<VideoDTO> searchHits = restTemplate.search(query, VideoDTO.class);// 获得searchHits,进行遍历得到contentList<VideoDTO> videoDTOS = new ArrayList<>();searchHits.forEach(hit -> {videoDTOS.add(hit.getContent());});System.out.println(videoDTOS);}/*** StringQuery搜索:将Elasticsearch查询作为JSON字符串*/public void stringQuery() {//搜索标题有 架构 关键词,描述有 spring关键字,时长范围是 10~6000之间的String dsl = """{"bool":{"must":[{"match":{"title":"架构"}},{"match":{"description":"spring"}},{"range":{"duration":{"gte":10,"lte":6000}}}]}}""";Query query = new StringQuery(dsl);List<SearchHit<VideoDTO>> searchHitList = restTemplate.search(query, VideoDTO.class).getSearchHits();// 获得searchHits,进行遍历得到contentList<VideoDTO> videoDTOS = new ArrayList<>();searchHitList.forEach(hit -> {videoDTOS.add(hit.getContent());});System.out.println(videoDTOS);}/*** 聚合查询* CriteriaQuery* 创建Criteria来搜索数据,而无需了解 Elasticsearch 查询的语法或基础知识* 允许用户通过简单地连接和组合,指定搜索文档必须满足的对象来构建查询*/void aggQuery() {Query query = NativeQuery.builder().withAggregation("category_group", Aggregation.of(a -> a.terms(ta -> ta.field("category").size(2)))).build();SearchHits<VideoDTO> searchHits = restTemplate.search(query, VideoDTO.class);//获取聚合数据ElasticsearchAggregations aggregationsContainer = (ElasticsearchAggregations) searchHits.getAggregations();Map<String, ElasticsearchAggregation> aggregations = Objects.requireNonNull(aggregationsContainer).aggregationsAsMap();//获取对应名称的聚合ElasticsearchAggregation aggregation = aggregations.get("category_group");Buckets<StringTermsBucket> buckets = aggregation.aggregation().getAggregate().sterms().buckets();//打印聚合信息buckets.array().forEach(bucket -> {System.out.println("组名:"+bucket.key().stringValue() + ", 值" + bucket.docCount());});// 获得searchHits,进行遍历得到contentList<VideoDTO> videoDTOS = new ArrayList<>();searchHits.forEach(hit -> {videoDTOS.add(hit.getContent());});System.out.println(videoDTOS);}
}

5.接口

@RestController
@RequestMapping("/test")
public class TestAPI {@Autowiredprivate EsTest esTest;@PostMapping("/test")public String test(){esTest.createIndex();esTest.deleteIndex();return "test";}
}

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

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

相关文章

【Python】简单实现Http网络请求功能

1.安装uvicorn和FastAPI pip3 install uvicorn pip3 install FastAPI2.python代码实现 import uvicorn from fastapi import FastAPIapp = FastAPI() @app.post("/ShowNum") async def ShowNum(x:int=1,y:int=2):print(和为:%d % (x+y))return x+yif __name__ == &q…

JMeter自动执行生成报告,批处理脚本

1、新建文件后缀.bat: 字符集使用 ANSI 编码,不然有中文会乱码,执行失败2、输入内容如下,根据实际情况修改路径:@echo off REM 设置 JMeter 的安装目录,根据实际情况修改路径 set JMETER_HOME=C:\apache-jmeter-5.4.1 REM 设置测试计划的路径,根据实际情况修改路径 set T…

奇迹mu1.03单机版安装教程+无需虚拟机+GM工具

今天为大家带来一款怀旧网单《奇迹mu1.03》的游戏架设,适用于单机娱乐, 仅供怀旧,本人已经安装游戏成功,特此带来详细安装教程。 适用环境单机视频演示 https://githubs.xyz/show/330.mp4亲测截图 架设步骤 关闭默认杀毒软件和其它自己下的杀毒软件 ,一定要检查关闭!!…

Toeplitz矩阵

具有下面形式的矩阵称为 Toeplitz 矩阵 (即在同一条对角线上的元素都相等) • Toeplitz 矩阵只有 2n − 1 个独立元素, 因此在存储一个 Toepliz 矩阵时, 只需存储第一列和第一行 (或第一列和最后一列);• 如果 T 对称, 则只需存储第一列. 用途:

【转载】【cursor】解决 cursor IDE 不能正常给 python 代码高亮的问题

原文链接:How to use python with the Cursor IDE首先参照上面的解决方法进行配置,配置完成后若不生效,请检查:1. 在 cursor 中把本地和远程的 python 扩展设置都进行以下修改 2. 若修改后不生效,重启 python 插件(看不明白的话请留言)

2025 年,程序员如何找准技术“掘金点”?

大家好,我是 V 哥,最近有很多小伙伴来问V哥,悲催的2024终于过去了,有的早早就给自己放假等春节了,有的也没逃过临了被约喝咖啡☕️,都想着先过完年再考虑怎么办,躺平可不行,又有谁会跟钱过不支呢。2025 年,V 哥也跟一些行业大佬聊过,共同的一个点就是市场经济依然不会…

基于ODX的工程诊断仪 - DST.Tester

INTEWORK-DST(Tester Option,以下简称DST.Tester)是经纬恒润自主研发的工程诊断仪,适用于新车型和ECU的诊断和刷写。DST.Tester不仅支持多种ISO协议,也可以按照客户需求开发刷写流程,满足整车厂和零部件供应商的诊断工程师使用需求。概述INTEWORK-DST(Tester Option,以下简…

JS-25 字符串方法_indexOF()

indexOf方法用于确定一个字符串再另一个字符串中第一次出现的位置,返回结果是匹配开始的位置。如果返回-1,就表示不匹配 hello world.indexOf(o)//4 hello world.indexOf(a)//4-1 床前明月光,疑是地上霜。一去二三里,举头望明月,低头思故乡。.indexOf("一去二三里&qu…

点特征直方图

对点特征的描述常见的描述手段有,曲率、法线等,由于点云散乱无序形态各异,即使人眼是判别特征与非特征点都极其困难,所以仅仅凭借曲率、法线来对点云特征进行描述,显然是不够的。那如何准确或者全面的去描述点的特征呢,这也是很多算法的基石,特征描述准确与否直接会影响…

高斯金字塔,高斯模糊,高斯差分

高斯金字塔、高斯模糊和高斯差分是图像处理中非常重要的技术,常用于图像缩放、降噪、特征提取等领域。 1. 高斯模糊(Gaussian Blur) 高斯模糊是一种降噪技术,基于高斯函数的图像处理技术,用于平滑图像,减少噪声或细节。它在图像处理和计算机视觉中非常常用,尤其是在预处…

改造应用从容器tomcat迁移到pas(信创容器中间件)的适配工作

背景 近年来由于信创要求的重视,软件国产化越来越要提上日程了,相信在相关行业的人已经有很多开始在准备信创相关适配改造工作了吧 我们公司也一样,经过2个月的研究终于算是把我们的主要产品改造成功,下面我就介绍下: 我们无源代码的tomcat容器应用如何迁移到普元Pas 正文…