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的…...

多线程(三):Thread 类的基本属性
上一个篇章浅浅了解了一下 线程的概念,进程与线程的区别,如何实现多线程编程。 而且上一章提到一个重要的面试点: start 方法和 run 方法的区别。 start 方法是从系统那里创建一个新的线程,这个线程会自动调用内部的run 方法&…...

蓝桥杯嵌入式第六课--串口收发
前言串口作为一个考试中考察频率较高的考点,其套路比较固定,因此值得我们仔细把握。本节课主要着眼于快速配置实现 串口收发与串口的中断。CubeMX配置选择串口2配置异步收发模式基本参数设置(波特率、校验位等等)开启串口收发中断…...

蓝桥杯冲刺 - Lastweek - 你离省一仅剩一步之遥!!!(掌握【DP】冲刺国赛)
文章目录💬前言🎯week3🌲day10-1背包完全背包多重背包多重背包 II分组背包🌲day2数字三角形 - 线性DP1015. 摘花生 - 数字三角形🌲day3最长上升子序列 - 线性DP1017. 怪盗基德的滑翔翼 - LIS1014.登山 - LIS最长公共子…...

C++ map与set的学习
1. 关联式容器在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器也…...

【C语言初阶】函数
文章目录💐专栏导读💐文章导读🌷函数是什么?🌷函数的分类🌺库函数🌺自定义函数🌷函数的参数🌷函数的调用🌷函数的嵌套调用和链式访问🌺嵌套调用&a…...

CentOS 7安装redis6.2.6(包括服务开机自启和开放端口)
CentOS 7安装redis6.2.61. 官网下载redis文件2. 校验安装依赖2.1 安装系统默认版本gcc2.2 升级gcc版本3. 解压编译安装4. 修改配置redis.conf4.2 设置密码4.3 绑定ip(可选)5. 启动redis服务并测试5.2 测试安装是否成功5.3 redis开机自启配置6.开放防火墙…...

基于注解的自动装配~
Autowired:实现自动装配功能的注解 Autowired注解能够标识的位置: 标识在成员变量上,此时不需要设置成员变量的set方法标识在成员变量对应的set方法上标识在为当前成员变量赋值的有参构造上使用注解进行自动装配,只要在其成员变量…...

【深度学习】【分布式训练】Collective通信操作及Pytorch示例
相关博客 【深度学习】【分布式训练】Collective通信操作及Pytorch示例 【自然语言处理】【大模型】大语言模型BLOOM推理工具测试 【自然语言处理】【大模型】GLM-130B:一个开源双语预训练语言模型 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介…...

Spring常用注解说明
目录 1.常用注解 2.特别说明 3.xml及注解方式 1.常用注解 (1) SpringBootApplication (2) ControllerRestControllerRequestMappingRequestParamPathVariableGetMappingPostMappingPutMappingDeleteMappingResponseBodyRequestBodyCrossOrigin (3) ConfigurationBeanServ…...

13-C++面向对象(纯虚函数(抽象类)、多继承、多继承-虚函数、菱形继承、虚继承、静态成员)
虚析构函数 存在父类指针指向子类对象的情况,应该将析构函数声明为虚函数(虚析构函数) 纯虚函数 纯虚函数:没有函数体且初始化为0的虚函数,用来定义接口规范 抽象类: 含有纯虚函数的类,不可以实…...