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

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...