IT博文
MySQL 事务隔离级别详解
使用 docker compose 安装 tidb
架构师日记-如何写的一手好代码
生产事故-记一次特殊的OOM排查
Docker安装RabbitMQ——基于docker-compose工具
使用 docker-compose 部署单机 RabbitMQ
只需3步,即刻体验Oracle Database 23c
长达 1.7 万字的 explain 关键字指南!
Redis为什么能抗住10万并发?揭秘性能优越的背后原因
深度剖析Redis九种数据结构实现原理
【绩效季】遇到一个好领导有多重要,从被打差绩效到收获成长
为什么Redis不直接使用C语言的字符串?
Java阻塞队列中的异类,SynchronousQueue底层实现原理剖析
如何调整和优化 Go 程序的内存管理方式?
应用部署引起上游服务抖动问题分析及优化实践方案
Java 并发工具合集 JUC 大爆发!!!
卷起来!!这才是 MySQL 事务 & MVCC 的真相。
JDK8 到 JDK17 有哪些吸引人的新特性?
告别StringUtil:使用Java 11的全新String API优化你的代码
从JDK8飞升到JDK17,再到未来的JDK21
Java JMH Benchmark Tutorial
linux和macOS下top命令区别
Windows10关闭Hyper-V的三种方法
为什么应该选择 POSTGRES?
阿里云对象存储 OSS 限流超过阈值自动关闭【防破产,保平安】
Java高并发革命!JDK19新特性——虚拟线程(Virtual Threads)
“请不要在虚拟机中运行此程序”的解决方案
Spring中的循环依赖及解决
浅谈复杂业务系统的架构设计 | 京东云技术团队
面试题:聊聊TCP的粘包、拆包以及解决方案
操作日志记录实现方式
字节跳动技术团队-慢 SQL 分析与优化
Spring Boot 使用 AOP 防止重复提交
Controller层代码就该这么写,简洁又优雅!
SpringBoot 项目 + JWT 完成用户登录、注册、鉴权
重复提交不再是问题!SpringBoot自定义注解+AOP巧妙解决
SpringBoot 整合 ES 实现 CRUD 操作
SpringBoot 整合 ES 进行各种高级查询搜索
SpringBoot操作ES进行各种高级查询
SpringBoot整合ES查询
如何做架构设计? | 京东云技术团队
最值得推荐的五个VPN软件(便宜+好用+稳定),靠谱的V2ray梯子工具
我说MySQL每张表最好不超过2000万数据,面试官让我回去等通知?
vivo 自研鲁班分布式 ID 服务实践
使用自带zookeeper超简单安装kafka
推荐 6 个很牛的 IDEA 插件
喜马拉雅 Redis 与 Pika 缓存使用军规
「程序员转型技术管理」必修的 10 个能力提升方向
jdk17 下 netty 导致堆内存疯涨原因排查 | 京东云技术团队
如何优雅做好项目管理?
MySQL 到 TiDB:Hive Metastore 横向扩展之路
聊聊即将到来的 MySQL5.7 停服事件
Linux终端环境配置
微软 Edge 浏览器隐藏功能一览:多线程下载、IE 模式、阻止视频自动播放等
Hutool 中那些常用的工具类和实用方法
clash 内核删库?汇总目前常用的内核仓库和客户端
JDK11 升级 JDK17 最全实践干货来了 | 京东云技术团队
我是如何写一篇技术文的?
虚拟线程原理及性能分析
Java线程池实现原理及其在美团业务中的实践
Editplus和EmEditor配置一键编译java运行环境
用Spring Boot 3.2虚拟线程搭建静态文件服务器有多快?
SpringBoot中使用LocalDateTime踩坑记录 - 程序员偏安 - 博客园
程序员必备!10款实用便捷的Git可视化管理工具 - 追逐时光者 - 博客园
基于Netty开发轻量级RPC框架
开发Java应用时如何用好Log
复杂SQL治理实践 | 京东物流技术团队
火山引擎ByteHouse:分析型数据库如何设计并发控制?
多次崩了之后,阿里云终于改了
推荐程序员必知的四大神级学习网站
初探分布式链路追踪
新项目为什么决定用 JDK 17了
Java上进了,JDK21 要来了,并发编程再也不是噩梦了
mapstruct这么用,同事也开始模仿
再见RestTemplate,Spring 6.1新特性:RestClient 了解一下!
【MySQL】MySQL表设计的经验(建议收藏)
如何正确地理解应用架构并开发
解读工行专利CN112905176B
工商银行取得「基于 Spring Boot 的 web 系统后端实现方法及装置」专利
IDEA 2024.1:Spring支持增强、GitHub Action支持增强、更新HTTP Client等
TIOBE 2 月:Go 首次进入前十、“上古语言” COBOL 和 Fortran 排名飙升
Java 21 虚拟线程如何限流控制吞吐量
🎉 通用、灵活、高性能分布式 ID 生成器 | CosId 2.6.6 发布
20年编程,AI编程6个月,关于Copliot辅助编码工具,你想知道的都在这里
Java 8 内存管理原理解析及内存故障排查实践
消息队列选型之 Kafka vs RabbitMQ
从 MongoDB 到 PostgreSQL 的大迁移
腾讯云4月8日故障复盘及情况说明
PHP 在 2024 年还值得学习吗?
AMD集显安装显卡驱动之后出现黑屏,建议这样解决
使用 Docker 部署 moments 微信朋友圈 - 谱次· - 博客园
Java 17 是最常用的 Java LTS 版本
盘点Lombok的几个骚操作
Llama 3 + Ollama + Open WebUI打造本机强大GPT
如何优雅地编写缓存代码
Gmeek快速上手
笔记软件思源远程和本地接入大语言模型服务Ollama实现AI辅助写作(Windows篇)
Git Subtree:简单粗暴的多项目管理神器
这款轻量级规则引擎,真香!!
Ollama教程:本地LLM管理、WebUI对话、Python/Java客户端API应用
GLM-4-9B支持 Ollama 部署
智谱AI开源代码生成大模型第四代版本:CodeGeeX4-ALL-9B
美团二面:如何保证Redis与Mysql双写一致性?连续两个面试问到了!
免费开源好用,Obsidian和Omnivore真正实现一键联动剪藏文章,手把手教程!
得物 Redis 设计与实践
架构图怎么画?手把手教您,以生鲜电商为例剖析业务/应用/数据/技术架构图
使用Hutool要注意了!升级到6.0后你调用的所有方法都将报错 - 掘金
别再用雪花算法生成ID了!试试这个吧
无敌的Arthas!
Navicat Premium v16、v17 破解激活
🎉 分布式接口文档聚合,Solon 是怎么做的?
深入体验全新 Cursor AI IDE 后,说杀疯了真不为过!
Nacos 3.0 架构全景解读,AI 时代服务注册中心的演进
本文档使用 MrDoc 发布
-
+
SpringBoot整合ES查询
springboot整个es有很多钟方法,比如TransportClient、RestClient、RestHighLevelClient、SpringData-Es、[Elasticsearch](https://so.csdn.net/so/search?q=Elasticsearch&spm=1001.2101.3001.7020)\-SQL等。 ElasticSearch 官方提供了 3 个 Client,具体如下: - org.elasticsearch.client.transport.TransportClient - org.elasticsearch.client.RestClient - org.elasticsearch.client.RestHighLevelClient TransportClient 位于 Elasticsearch 包下,是 Elasticsearch 官方早期支持的 ElasticSearch Client,但是在 ElasticSearch 7.x 版本中已经标注为 Deprecated,并且将在 8.0 版本中移除,所以建议不使用 TransportClient 作为 ElasticSearch Client。 RestHighLevelClient 是 TransportClient 的直接替代者,也是 ElasticSearch 官方推荐和默认的 Client #### 准备数据 ```shell delete employees PUT /employees/ { "mappings": { "properties": { "age": { "type": "integer" }, "gender": { "type": "keyword" }, "job": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 50 } } }, "name": { "type": "keyword" }, "salary": { "type": "integer" } } } } PUT /employees/_bulk { "index" : { "_id" : "1" } } { "name" : "Emma","age":32,"job":"Product Manager","gender":"female","salary":35000 } { "index" : { "_id" : "2" } } { "name" : "Underwood","age":41,"job":"Dev Manager","gender":"male","salary": 50000} { "index" : { "_id" : "3" } } { "name" : "Tran","age":25,"job":"Web Designer","gender":"male","salary":18000 } { "index" : { "_id" : "4" } } { "name" : "Rivera","age":26,"job":"Web Designer","gender":"female","salary": 22000} { "index" : { "_id" : "5" } } { "name" : "Rose","age":25,"job":"QA","gender":"female","salary":18000 } { "index" : { "_id" : "6" } } { "name" : "Lucy","age":31,"job":"QA","gender":"female","salary": 25000} { "index" : { "_id" : "7" } } { "name" : "Byrd","age":27,"job":"QA","gender":"male","salary":20000 } { "index" : { "_id" : "8" } } { "name" : "Foster","age":27,"job":"Java Programmer","gender":"male","salary": 20000} { "index" : { "_id" : "9" } } { "name" : "Gregory","age":32,"job":"Java Programmer","gender":"male","salary":22000 } { "index" : { "_id" : "10" } } { "name" : "Bryant","age":20,"job":"Java Programmer","gender":"male","salary": 9000} { "index" : { "_id" : "11" } } { "name" : "Jenny","age":36,"job":"Java Programmer","gender":"female","salary":38000 } { "index" : { "_id" : "12" } } { "name" : "Mcdonald","age":31,"job":"Java Programmer","gender":"male","salary": 32000} { "index" : { "_id" : "13" } } { "name" : "Jonthna","age":30,"job":"Java Programmer","gender":"female","salary":30000 } { "index" : { "_id" : "14" } } { "name" : "Marshall","age":32,"job":"Javascript Programmer","gender":"male","salary": 25000} { "index" : { "_id" : "15" } } { "name" : "King","age":33,"job":"Java Programmer","gender":"male","salary":28000 } { "index" : { "_id" : "16" } } { "name" : "Mccarthy","age":21,"job":"Javascript Programmer","gender":"male","salary": 16000} { "index" : { "_id" : "17" } } { "name" : "Goodwin","age":25,"job":"Javascript Programmer","gender":"male","salary": 16000} { "index" : { "_id" : "18" } } { "name" : "Catherine","age":29,"job":"Javascript Programmer","gender":"female","salary": 20000} { "index" : { "_id" : "19" } } { "name" : "Boone","age":30,"job":"DBA","gender":"male","salary": 30000} { "index" : { "_id" : "20" } } { "name" : "Kathy","age":29,"job":"DBA","gender":"female","salary": 20000} ``` #### 引入依赖 可以复制下边的依赖贴入POM文件,还可以在阿里云的脚手架上勾选,然后下载生成的工程 ```xml <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.3.7.RELEASE</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.15</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.7.RELEASE</version> <configuration> <mainClass>com.tenic.springbootes.SpringbootEsApplication</mainClass> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` #### 修改配置文件 ```properties # 应用名称 spring.application.name=springboot-es elasticsearch.host=x.x.x.x elasticsearch.port=9200 elasticsearch.username= elasticsearch.password= ``` #### 目录结构  #### 创建配置类,配置ES相关信息,并创建RestHighLevelClient ```java @Configuration public class ElasticsearchConfig { @Value("${elasticsearch.host}") private String host; @Value("${elasticsearch.port}") private int port; @Value("${elasticsearch.username}") private String userName; @Value("${elasticsearch.password}") private String password; @Bean(destroyMethod = "close") public RestHighLevelClient restClient() { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); RestClientBuilder builder = RestClient.builder(new HttpHost(host, port)) .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)); RestHighLevelClient client = new RestHighLevelClient(builder); return client; } } ``` #### 创建映射实体 ```java @Data public class Employees { private String name; private Integer age; private String gender; private String job; private Integer salary; } ``` #### 配置工具类 ```java public interface Constant { String EMPLOYEES_INDEX = "employees"; } ``` #### 创建测试类 ```java @SpringBootTest @RunWith(SpringRunner.class) class SpringbootEsApplicationTests { @Test void contextLoads() {} } ``` #### 继承测试类,本地CRUD测试一下 ```java public class SpringbootEsApplicationDemo1 extends SpringbootEsApplicationTests{ @Autowired private RestHighLevelClient restHighLevelClient; /** * 查询索引employees * @throws IOException */ @Test public void test1() throws IOException { QueryBuilder queryBuilder = new MatchAllQueryBuilder(); SearchResponse response = search(queryBuilder); printResponse(response); } /** * 插入文档 * @throws IOException */ @Test public void test2() throws IOException { Employees employees = new Employees("zhangsan",44,"male","CTO",3300); IndexRequest indexRequest = new IndexRequest(EMPLOYEES_INDEX); indexRequest.id("21").source(JSONObject.toJSONString(employees),XContentType.JSON); IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT); System.out.println("创建状态:"+indexResponse.status()); System.out.println(indexResponse); } /** * 更新文档 * @throws IOException */ @Test public void test3() throws IOException { UpdateRequest updateRequest = new UpdateRequest(EMPLOYEES_INDEX,"21"); Employees employee = new Employees(); employee.setName("wangwu"); updateRequest.doc(JSONObject.toJSONString(employee),XContentType.JSON); UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT); System.out.println("更新状态:"+update.status()); System.out.println(update); } /** * 删除文档 * @throws IOException */ @Test public void test4() throws IOException { DeleteRequest deleteRequest = new DeleteRequest(EMPLOYEES_INDEX,"21"); DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT); System.out.println("删除状态:"+deleteResponse.status()); System.out.println(deleteResponse); } /** * 高亮查询 * @throws IOException */ @Test public void test5() throws IOException { SearchRequest searchRequest = new SearchRequest(); searchRequest.indices(EMPLOYEES_INDEX); // term 查询 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); TermQueryBuilder query = new TermQueryBuilder("job","programmer"); sourceBuilder.query(query); // 高亮查询 HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.preTags("<span style='color:red'>"); highlightBuilder.postTags("</span>"); highlightBuilder.requireFieldMatch(false); highlightBuilder.field("*"); sourceBuilder.highlighter(highlightBuilder); searchRequest.source(sourceBuilder); SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); System.out.println("查询状态:"+searchResponse.status()); System.out.println("查询总条数:"+searchResponse.getHits().getTotalHits()); printResponse(searchResponse); } /** * 查询索引 */ private SearchResponse search(QueryBuilder query) throws IOException { SearchRequest searchSource = new SearchRequest(); searchSource.indices(EMPLOYEES_INDEX); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(query); searchSource.source(sourceBuilder); SearchResponse response = restHighLevelClient.search(searchSource, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); System.out.println("查询状态:"+response.status()); System.out.println("查询总条数:"+hits.getTotalHits()); return response; } /** * 打印结果,并转换成实体对象 */ private void printResponse(SearchResponse response) { SearchHits hits = response.getHits(); for (SearchHit hit : hits.getHits()) { Employees employees = JSONObject.parseObject(hit.getSourceAsString(), Employees.class); System.out.println(employees); } } } ``` #### 分页查询,search after,scroll api查询 ```shell public class SpringbootEsApplicationDemo2 extends SpringbootEsApplicationTests{ @Autowired private RestHighLevelClient restHighLevelClient; /** * FROM/SIZE 分页查询,from:从指定行开始,size:需要查询页的条数 * ES最大查询是10000条数据,所以要FROM+SIZE<=10000 * @throws IOException */ @Test public void test1() throws IOException { SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); QueryBuilder queryBuilder = new MatchAllQueryBuilder(); sourceBuilder.query(queryBuilder); sourceBuilder.from(2); sourceBuilder.size(5); processESCmd(sourceBuilder); } /** * search after 深度分页查询数据 * @throws IOException */ @Test public void test2() throws IOException { SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); QueryBuilder queryBuilder = new MatchAllQueryBuilder(); sourceBuilder.query(queryBuilder); sourceBuilder.size(19); sourceBuilder.sort("age", SortOrder.DESC); sourceBuilder.sort("_id",SortOrder.ASC); SearchResponse searchResponse = processESCmd(sourceBuilder); while(searchResponse.getHits().getHits().length>0) { SearchHit[] hits = searchResponse.getHits().getHits(); SearchHit hit = hits[hits.length - 1]; sourceBuilder.searchAfter(hit.getSortValues()); searchResponse = processESCmd(sourceBuilder); } } /** * scroll api 查询 * 基于快照查询,此时如果有新数据插入索引,该查询不会查到 * 其中scrollRequest.scroll("1m");中设置的是scroll请求的上下文的存活时间 * @throws IOException */ @Test public void test3() throws IOException { SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); QueryBuilder queryBuilder = new MatchAllQueryBuilder(); sourceBuilder.query(queryBuilder); sourceBuilder.size(5); SearchRequest searchRequest = new SearchRequest(EMPLOYEES_INDEX); searchRequest.scroll("1m"); searchRequest.source(sourceBuilder); SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); while(search.getHits().getHits().length>0){ for (SearchHit hit : search.getHits()) { System.out.println("ID:"+hit.getId()+"--"+ JSONObject.parseObject(hit.getSourceAsString(), Employees.class)); } String scrollId = search.getScrollId(); SearchScrollRequest scrollRequest = new SearchScrollRequest(); scrollRequest.scrollId(scrollId); scrollRequest.scroll("1m"); search = restHighLevelClient.scroll(scrollRequest,RequestOptions.DEFAULT); } } private SearchResponse processESCmd(SearchSourceBuilder sourceBuilder) throws IOException { SearchRequest searchRequest = new SearchRequest(EMPLOYEES_INDEX); searchRequest.source(sourceBuilder); SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); System.out.println("查询状态:"+search.status()); System.out.println("查询条数:"+search.getHits().getHits().length); for (SearchHit hit : search.getHits()) { System.out.println("ID:"+hit.getId()+"--"+ JSONObject.parseObject(hit.getSourceAsString(), Employees.class)); } return search; } } ``` [SpringBoot整合ES查询 - Tenic - 博客园 (cnblogs.com)](https://www.cnblogs.com/tenic/p/16795911.html)
admin
2023年5月29日 07:26
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码