Elasticsearch 学习+SpringBoot实战教程(三)
需要学习基础的可参照这两文章
Elasticsearch 学习+SpringBoot实战教程(一)
Elasticsearch 学习+SpringBoot实战教程(一)_桂亭亭的博客-CSDN博客
Elasticsearch 学习+SpringBoot实战教程(二)
Elasticsearch 学习+SpringBoot实战教程(二)_桂亭亭的博客-CSDN博客
前言: 经过了前面2课的学习我们已经大致明白了ES怎么使用,包括原生语句,javaapi等等,现在我们要在业务中使用了,
所以我们选择spring-data作为我们的ORM框架,快速开发代码。
同时需要给规范化操作
目录
0 前辈动作
1 Springboot项目引入依赖
2 建立目录与文件
3 配置文件
4 实体类
1 使用ElasticsearchOperations的方式
新增文档
更新文档
删除文档
查询所有
查询指定id
分页+指定条件+高亮显示+排序+过滤结果
2 使用RestHighLevelClient的方式
精确查询
分页查询
字符匹配AND精准查询
编辑字符匹配OR精准查询
模糊查询
0 前置动作
1 Springboot项目引入依赖
注意你的ES版本号
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.20</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.10.1</version><exclusions><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.10.1</version></dependency>
2 建立目录与文件


![]()
![]()
3 配置文件

spring:elasticsearch:uris: localhost:9200connection-timeout: 3000socket-timeout: 5000
4 实体类
package com.example.eslearn.entity;import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;import java.io.Serializable;/*** Document: 将这个类对象转为 es 中一条文档进行录入* indexName: 用来指定文档的索引名称* createIndex: 用来指定是否创建索引,默认为false*/
@Document(indexName = "user", createIndex = true)
public class UserDocument implements Serializable {@Id // 用来将放入对象id值作为文档_id进行映射private String id;@Field(type = FieldType.Keyword) // 字段映射类型private String name;private String sex;private Integer age;@Field(type = FieldType.Text) // 字段映射类型private String city;
1 使用ElasticsearchOperations的方式
优点:更想我们的springdata的使用风格,简单,快捷,个人使用
新增文档
private final ElasticsearchOperations ESO;// set方法注入@Autowiredpublic CRUDService2(ElasticsearchOperations elasticsearchOperations) {this.ESO = elasticsearchOperations;}// 新增文档public String save() {UserDocument user = new UserDocument();user.setName("说不定看见的");user.setCity("北京 上海 西安");user.setAge(22);user.setSex("男");UserDocument save = ESO.save(user);System.out.println(save);return JSON.toJSONString(save);}

使用可视化软件查询,得到下面的结果


更新文档
// 更新文档public String update() {UserDocument user = new UserDocument();user.setId("W7w2HYcB32f1ZLmxRwzw");user.setName("说快来打见的");user.setCity("北京 上海 西安");user.setAge(21);user.setSex("女");UserDocument save = ESO.save(user);System.out.println(save);return JSON.toJSONString(save);}
删除文档
// 删除public String delete(){UserDocument userDocument = new UserDocument();userDocument.setId("8966e506-1763-4d4b-bf1c-4f5d9bd9b052");return ESO.delete(userDocument);}

查询所有
// 查询所有public String findAll(){//查询所有SearchHits<UserDocument> search = ESO.search(Query.findAll(), UserDocument.class);for (SearchHit<UserDocument> uc : search) {System.out.println(uc.getContent());}return JSON.toJSONString(search);}

查询指定id
// 根据id查询文档public String getById(){UserDocument userDocument = ESO.get("W7w2HYcB32f1ZLmxRwzw", UserDocument.class);return JSON.toJSONString(userDocument);}
分页+指定条件+高亮显示+排序+过滤结果
服务层
//大杂烩,一次学会public String findSource(){//查询条件构建MatchQueryBuilder mp=new MatchQueryBuilder("name","妲己");//排序构建FieldSortBuilder f = new FieldSortBuilder("age");//分页构建Pageable page= PageRequest.of(0,5);// 高亮构建HighlightBuilder highlightBuilder = new HighlightBuilder().preTags("<span style='color:yellow'>").postTags("</span>").field("name");//结果过滤构建,相当于返回那些字段FetchSourceFilter filter = new FetchSourceFilter(new String[]{"name", "city"}, null);//查询语句构建NativeSearchQueryBuilder query = new NativeSearchQueryBuilder().withQuery(mp).withSorts(f).withPageable(page).withHighlightBuilder(highlightBuilder).withSourceFilter(filter);//执行查询SearchHits<UserDocument> search = ESO.search(query.build(), UserDocument.class);return JSON.toJSONString(search);}
控制器
@GetMapping("/findSource")private String findSource(){return sv.findSource();}
2 使用RestHighLevelClient的方式
优点:安全,企业级常用
精确查询
对应的原生查询语句
注意这里的term就是精准查询到 关键字
GET user/_search
{"query": {"term": {"city": "上海"}}
}
服务层
// 文档搜索public String searchDocument(String indexName,String city){//2 构建搜索请求SearchRequest searchRequest = new SearchRequest().indices(indexName);//3 构建搜索内容TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("city", city);SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(termQueryBuilder);//4 填充搜索内容searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = null;try {//5 执行搜索操作searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}//6 返回值return JSON.toJSONString(searchResponse.getHits().getHits());}
控制器
@GetMapping("/searchUserByCity")public String searchUserByCity() throws IOException {return service.searchDocument("user","上海");}
访问链接localhost:8080/searchUserByCity

分页查询
GET user/_search
{"query": {"term": {"city": "上海"}},"from":0,"size":5
}
服务层
// 文档搜索--分页查询public String searchDocument2(String indexName,String city){//2 构建搜索请求SearchRequest searchRequest = new SearchRequest().indices(indexName);//3 构建搜索内容SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//拿到前5条数据searchSourceBuilder.query(QueryBuilders.termQuery("city", city)).from(0).size(5);//4 填充搜索内容searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = null;try {//5 执行搜索操作searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}//6 返回值return JSON.toJSONString(searchResponse.getHits().getHits());}
控制层
@GetMapping("/searchUserByCity2")public String searchUserByCity2() throws IOException {return service.searchDocument2("user","上海");}
访问localhost:8080/searchUserByCity2
字符匹配AND精准查询
term 与matchphrase的比较 term用于精确查找有点像 mysql里面的"=" match是先将查询关键字分词然后再进行查找。term一般用在keywokrd类型的字段上进行精确查找。
注意这里的bool,表示使用布尔查询,其中的must是相当于SQL语句中的and的意思。
所以就是查找name中包含“妲己”并且年龄为22岁的信息,请注意不能写成"妲",因为我们在新建文档的时候是这样新建的“妲己”,那么我们如果匹配“妲”就会匹配不到,加入这样写就可以匹配到了“妲 己”,请注意空格,这是分词的依据之一
ES查询语句。

GET user/_search
{"query": {"bool":{"must": [{"match_phrase": {"name": "妲己"}},{"term": {"age": "32"}}]}},"from":0,"size":10
}
服务层
// 文档分词搜索+精确查询public String searchDocument3(String indexName,String name,Integer age){//2 构建搜索请求SearchRequest searchRequest = new SearchRequest().indices(indexName);SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//3 构建复杂的查询语句BoolQueryBuilder bq=QueryBuilders.boolQuery()//分词匹配.must(QueryBuilders.matchPhraseQuery("name",name))//精确匹配.must(QueryBuilders.matchQuery("age",age));//4 填充搜索语句searchSourceBuilder.query(bq).from(0).size(5);//4 填充搜索内容searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = null;try {//5 执行搜索操作searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}//6 返回值return JSON.toJSONString(searchResponse.getHits());}
控制层
@GetMapping("/searchUser3")public String searchUser3() throws IOException {return service.searchDocument3("user","妲己",32);}
字符匹配OR精准查询
原始查询语句
GET user/_search
{"query": {"bool":{"should": [{"match_phrase": {"name": "妲己"}},{"term": {"age": "32"}}]}},"from":0,"size":10
}
服务层
// 文档分词搜索OR精确查询public String searchDocument4(String indexName,String name,Integer age){//2 构建搜索请求SearchRequest searchRequest = new SearchRequest().indices(indexName);SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//3 构建复杂的查询语句BoolQueryBuilder bq=QueryBuilders.boolQuery()//分词匹配.should(QueryBuilders.matchPhraseQuery("name",name))//精确匹配.should(QueryBuilders.matchQuery("age",age));//4 填充搜索语句searchSourceBuilder.query(bq).from(0).size(5);//4 填充搜索内容searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = null;try {//5 执行搜索操作searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}//6 返回值return JSON.toJSONString(searchResponse.getHits());}
控制层
@GetMapping("/searchUser4")public String searchUser4() throws IOException {return service.searchDocument4("user","妲己",22);}
结果

模糊查询
原始语句
GET user/_search
{"query": {"wildcard": {"city": {"value": "上*"}}}
}
// 文档模糊查询public String searchDocument5(String indexName,String city){//2 构建搜索请求SearchRequest searchRequest = new SearchRequest().indices(indexName);SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//3 构建模糊查询的语句WildcardQueryBuilder bq=QueryBuilders.wildcardQuery("city",city);//4 填充搜索语句searchSourceBuilder.query(bq);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = null;try {//5 执行搜索操作searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}//6 返回值return JSON.toJSONString(searchResponse.getHits());}
@GetMapping("/searchUser5")public String searchUser5() throws IOException {return service.searchDocument5("user","上*");}
结果

相关文章:
Elasticsearch 学习+SpringBoot实战教程(三)
需要学习基础的可参照这两文章 Elasticsearch 学习SpringBoot实战教程(一) Elasticsearch 学习SpringBoot实战教程(一)_桂亭亭的博客-CSDN博客 Elasticsearch 学习SpringBoot实战教程(二) Elasticsearch …...
try-with-resource
try-with-resource是Java 7中引入的新特性,它可以方便地管理资源,自动关闭资源,从而避免了资源泄漏的问题。 作用 使用try-with-resource语句可以简化代码,避免了手动关闭资源的繁琐操作,同时还可以保证资源的正确关闭…...
leetcode148_排序链表的3种解法
1. 题目2. 解答 2.1. 解法12.2. 解法22.3. 解法3 1. 题目 给你链表的头结点head,请将其按升序排列并返回排序后的链表。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullp…...
使用stm32实现电机的PID控制
使用stm32实现电机的PID控制 PID控制应该算是非常古老而且应用非常广泛的控制算法了,小到热水壶温度控制,大到控制无人机的飞行姿态和飞行速度等等。在电机控制中,PID算法用的尤为常见。 文章目录使用stm32实现电机的PID控制一、位置式PID1.计…...
数学原理—嵌入矩阵
目录 1.嵌入矩阵的基本作用 2.嵌入矩阵的数学解释 3.嵌入矩阵在联合分布适应中的数学推导主要包括以下几个步骤 4.在JDA中,怎么得到嵌入矩阵 5.联合分布自适应中如何得到嵌入矩阵 (另一种解释) 1.嵌入矩阵的基本作用 在机器学习中&a…...
English Learning - L2 语音作业打卡 辅音翘舌音 [ʃ] [ʒ] 空气摩擦音 [h] Day31 2023.3.23 周四
English Learning - L2 语音作业打卡 辅音翘舌音 [ʃ] [ʒ] 空气摩擦音 [h] Day31 2023.3.23 周四💌发音小贴士:💌当日目标音发音规则/技巧:翘舌音 [ʃ] [ʒ]空气摩擦音 [h]🍭 Part 1【热身练习】🍭 Part2【练习内容】…...
记录springboot+vue+fastdfs实现简易的文件(上传、下载、删除、预览)操作
前言说明:springboot vue FastDFS实现文件上传(支持预览)升级版 FASTDFS部分 FASTDFS安装过程:基于centos 7安装FastDFS文件服务器 SpringBoot部分 springboot源码实现 package com.core.doc.controller;import com.baomid…...
Java中循环使用Stream应用场景
在JAVA中,涉及到对数组、Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。例如,现在有这么一个需求:从给定句子中返回单词长度大于5的单词列表,…...
中国蚁剑AntSword实战
中国蚁剑AntSword实战1.基本使用方法2.绕过安全狗连接3.请求包修改UA特征伪造RSA流量加密4.插件使用1.基本使用方法 打开蚂蚁宝剑,右键添加数据: 输入已经上传马的路径和连接密码: 测试连接,连接成功! GetShell了&…...
C++ 直接初始化和拷贝初始化
首先我们介绍直接初始化:编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。文字描述可能会让你们云里雾里,那我们直接看代码: //先设计这样的一个类 class A{ public:A(){ cout << "A()" << endl; }A…...
数据迁移工具
1.Kettle Kettle是一款国外开源的ETL工具,纯Java编写,绿色无需安装,数据抽取高效稳定 (数据迁移工具)。 Kettle 中有两种脚本文件,transformation 和 job,transformation 完成针对数据的基础转换,job 则完成整个工作流的控制。 Kettle 中文名称叫水壶,该项目的主程序…...
【C/C++】程序的内存开辟
在C/C语言中,不同的类型开辟的空间区域都是不一样的. 这节我们就简单了解下开辟不同的类型内存所存放的区域在哪里. 文章目录栈区(stack)堆区(heap)数据段(静态区)常量存储区内存开辟布局图栈区…...
全网最完整,接口测试总结彻底打通接口自动化大门,看这篇就够了......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 所谓接口࿰…...
28-flume和kafka为什么要结合使用
一:flume和kafka为什么要结合使用 首先:Flume 和 Kafka 都是用于处理大量数据的工具,但它们的设计目的不同。Flume 是一个可靠地收集、聚合和移动大量日志和事件数据的工具,而Kafka则是一个高吞吐量的分布式消息队列,…...
STM32外设-定时器详解
0. 概述 本文针对STM32F1系列,主要讲解了其中的8个定时器的原理和功能 1. 定时器分类 STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器基本定时器 TIM6 和 TIM7 是一个 16 位…...
史上最详细的改良顺序表讲解,看完不会你打我
目录 0.什么是顺序表 1.顺序表里结构体的定义 2.顺序表的初始化 3.顺序表的输入 4.增加顺序表的长度 5.1顺序表的元素查找(按位查找) 5.2顺序表的元素查找(按值查找)在顺序表进行按值查找,大概只能通过遍历的方…...
【Unity入门】资源包导入和导出
【Unity入门】资源包导入和导出 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (1)资源目录 Unity的资源(模型,场景,脚本)等都保存在Assert目录下&…...
python条件语句与循环语句
目录 一、条件语句 1.1if 二、循环语句 2.1while 2.2for循环 2.3break和continue 三、test和总结 一、条件语句 1.1if Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 Python程序语言指定: 任…...
【leetcode】链表(2)
目录 1. 环形链表 解题思路 2. 环形链表 II 解题思路 3. 删除排序链表中的重复元素 解题思路 4. 删除排序链表中的重复元素 II 解题思路 5. 移除链表元素 解题思路 6. 链表的中间结点 解题思路 1. 环形链表 OJ:环形链表 给你一个链表的头节点 head &am…...
使用Vue+vue-router+路由守卫实现路由鉴权功能实战
目录 一、本节介绍和上节回顾 1. 上节介绍 2. Vue SpringBoot前后端分离项目实战的目录 3. 本小节介绍 二、Vue-router改造以及路由鉴权 1. 路由数据的拆分 2. 路由守卫 三、404错误页的实现 1. 创建全局css样式 2. 全局样式引入 3. 404页面的开发 4. el-button的…...
保姆级教程:用ENVI+SNAP搞定哨兵1号雷达数据预处理(附水稻监测实战)
从零掌握哨兵1号雷达数据处理:ENVI与SNAP双软件协同实战指南 当第一次接触哨兵1号雷达数据时,许多研究者都会被其独特的成像机制和处理流程所困扰。与光学遥感不同,雷达数据需要经过一系列专业预处理才能用于分析。本文将带你系统掌握ENVI和…...
IPBan:企业级服务器安全防护解决方案的架构设计与实现
IPBan:企业级服务器安全防护解决方案的架构设计与实现 【免费下载链接】IPBan Since 2011, IPBan is the worlds most trusted, free security software to block hackers and botnets. With both Windows and Linux support, IPBan has your dedicated or cloud se…...
Ladybug终极指南:专业气象数据分析与可视化工具
Ladybug终极指南:专业气象数据分析与可视化工具 【免费下载链接】ladybug 🐞 Core ladybug library for weather data analysis and visualization 项目地址: https://gitcode.com/gh_mirrors/lad/ladybug Ladybug是一个功能强大的Python库&#…...
告别繁琐点击:3大功能助你实现智能文档获取与自动化下载
告别繁琐点击:3大功能助你实现智能文档获取与自动化下载 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了…...
拆解昇腾 CANN 五层架构:一个 MatMul 请求的完整旅程
适合人群:想从全局视角理解 CANN 架构的开发者 核心仓库:https://atomgit.com/cann 阅读时长:6 分钟 目录 一、为什么需要五层架构?二、第1层:昇腾计算语言层 AscendCL三、第2层:昇腾计算服务层四、第3层&…...
专业联发科设备bootloader解锁与安全绕过实战指南
专业联发科设备bootloader解锁与安全绕过实战指南 【免费下载链接】mtkclient-gui GUI tool for unlocking bootloader and bypassing authorization on Mediatek devices (Not maintained anymore) 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient-gui mtkclie…...
3分钟学会B站缓存视频永久保存:m4s-converter完整使用指南
3分钟学会B站缓存视频永久保存:m4s-converter完整使用指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经在B站缓存了珍贵…...
光电效应实验避坑指南:从汞灯预热到遏止电压判读,新手常犯的5个错误
光电效应实验避坑指南:从汞灯预热到遏止电压判读的5个关键误区 在大学的物理实验室里,光电效应实验就像一位性格古怪的教授——看似简单明了,实则暗藏玄机。许多同学满怀信心地走进实验室,却在数据采集阶段屡屡碰壁,最…...
长鑫存储逆袭:从近10年亏损超366亿到盈利超预期,能否成“中国海力士”?
长鑫存储逆袭:从巨亏到盈利超预期,能否成为“中国海力士”?“韩国巨头布局存储,中国巨头热衷于外卖。”这一波存储涨价潮,很多人用戏谑的方式来表达对中国几家互联网公司的“恨铁不成钢”。但长鑫存储却凭借一份极度亮…...
告别仿真卡顿!Synopsys AXI VIP Memory模型实战:从地址配置到后门读写(附避坑指南)
告别仿真卡顿!Synopsys AXI VIP Memory模型实战:从地址配置到后门读写(附避坑指南) 在复杂SoC验证中,仿真速度直接决定了项目周期。当AXI总线上的数据吞吐量达到GB/s级别时,传统的前门读写操作会让仿真器陷…...


