【纯干货】SpringBoot 整合 ES 进行各种高级查询搜索
在上篇 SpringBoot 整合 ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的索引和文档的基本增删改查的操作方法!
本文将重点介绍 ES 的各种高级查询写法和使用。
废话不多说,直接上代码!
二、代码实践
本文采用的SpringBoot
版本号是2.1.0.RELEASE
,服务端 es 的版本号是6.8.2
,客户端采用的是官方推荐的Elastic Java High Level Rest Client
版本号是6.4.2
,方便与SpringBoot
的版本兼容。
es 最大的亮点就是查询非常丰富,可以在上亿的数据里面快速搜索出目标数据,查询如果实现呢?请看下文
单条件精确查询
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 单条件精确查询* @throws IOException*/@Testpublic void search0() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.termsQuery("name", "赵里"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
多条件精确查询,取并集
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 多条件精确查询,取并集* @throws IOException*/@Testpublic void search1() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.termsQuery("name", "张", "陈"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
范围查询
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 范围查询,包括from、to* @throws IOException*/@Testpublic void search2() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.rangeQuery("age").from(20).to(32));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}/*** 范围查询,不包括from、to* @throws IOException*/@Testpublic void search3() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.rangeQuery("age").from(20,false).to(30, false));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}/*** 范围查询, lt:小于,gt:大于* @throws IOException*/@Testpublic void search4() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.rangeQuery("age").lt(30).gt(20));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
模糊查询,支持通配符
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 模糊查询,支持通配符* @throws IOException*/@Testpublic void search5() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.wildcardQuery("name","张三"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
不使用通配符的模糊查询,左右匹配
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 不使用通配符的模糊查询,左右匹配* @throws IOException*/@Testpublic void search6() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.queryStringQuery("张三").field("name"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
多字段模糊查询
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 多字段模糊查询* @throws IOException*/@Testpublic void search7() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.multiMatchQuery("长", "name", "city"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
多字段模糊查询
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 分页搜索* @throws IOException*/@Testpublic void search8() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().from(0).size(2);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
字段排序
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 排序,字段的类型必须是:integer、double、long或者keyword* @throws IOException*/@Testpublic void search9() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().sort("createTime", SortOrder.ASC);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
精确统计筛选文档数
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 精确统计筛选文档数,查询性能有所降低* @throws IOException*/@Testpublic void search10() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().trackTotalHits(true);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
设置源字段过滤返回
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段* @throws IOException*/@Testpublic void search11() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().fetchSource(new String[]{"name","age","city","createTime"},new String[]{});//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
根据 id 精确匹配
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 根据id精确匹配* @throws IOException*/@Testpublic void search12() throws IOException {String[] ids = new String[]{"1","2"};// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.termsQuery("_id", ids));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}}
matchAllQuery 搜索全部
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** matchAllQuery搜索全部* @throws IOException*/@Testpublic void search21() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}
}
match 搜索匹配
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** match搜索匹配* @throws IOException*/@Testpublic void search22() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchQuery("name", "张王"));//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}
}
bool组合查询
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** bool组合查询* @throws IOException*/@Testpublic void search23() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder=new BoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.matchQuery("name", "张王"));boolQueryBuilder.must(QueryBuilders.rangeQuery("age").lte(30).gte(20));builder.query(boolQueryBuilder);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}
}
nested 类型嵌套查询
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** nested类型嵌套查询* @throws IOException*/@Testpublic void search24() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件查询BoolQueryBuilder mainBool=new BoolQueryBuilder();mainBool.must(QueryBuilders.matchQuery("name", "赵六"));//nested类型嵌套查询BoolQueryBuilder boolQueryBuilder=new BoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.matchQuery("products.brand", "A"));boolQueryBuilder.must(QueryBuilders.matchQuery("products.title", "巧克力"));NestedQueryBuilder nested = QueryBuilders.nestedQuery("products",boolQueryBuilder, ScoreMode.None);mainBool.must(nested);builder.query(mainBool);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}
}
多条件查询 + 排序 + 分页
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 多条件查询 + 排序 + 分页* @throws IOException*/@Testpublic void search29() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件搜索BoolQueryBuilder boolQueryBuilder=new BoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.matchQuery("name", "张王"));boolQueryBuilder.must(QueryBuilders.rangeQuery("age").lte(30).gte(20));builder.query(boolQueryBuilder);//结果集合分页builder.from(0).size(2);//排序builder.sort("createTime",SortOrder.ASC);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}
}
聚合查询-求和
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 聚合查询 sum* @throws IOException*/@Testpublic void search30() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilder aggregation = AggregationBuilders.sum("sum_age").field("age");builder.aggregation(aggregation);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}
}
聚合查询-求平均值
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 聚合查询 avg* @throws IOException*/@Testpublic void search31() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilder aggregation = AggregationBuilders.avg("avg_age").field("age");builder.aggregation(aggregation);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}
}
聚合查询-计数
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 聚合查询 count* @throws IOException*/@Testpublic void search32() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilder aggregation = AggregationBuilders.count("count_age").field("age");builder.aggregation(aggregation);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}
}
聚合查询-分组
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
public class SearchJunit {@Autowiredprivate RestHighLevelClient client;/*** 聚合查询 分组* @throws IOException*/@Testpublic void search33() throws IOException {// 创建请求SearchSourceBuilder builder = new SearchSourceBuilder();//条件搜索builder.query(QueryBuilders.matchAllQuery());//聚合查询AggregationBuilder aggregation = AggregationBuilders.terms("tag_createTime").field("createTime").subAggregation(AggregationBuilders.count("count_age").field("age")) //计数.subAggregation(AggregationBuilders.sum("sum_age").field("age")) //求和.subAggregation(AggregationBuilders.avg("avg_age").field("age")); //求平均值builder.aggregation(aggregation);//不输出原始数据builder.size(0);//搜索SearchRequest searchRequest = new SearchRequest();searchRequest.indices("cs_index");searchRequest.types("_doc");searchRequest.source(builder);// 执行请求SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);// 解析查询结果System.out.println(response.toString());}
}
三、小结
本文主要围绕 SpringBoot 整合 ElasticSearch 进行各种高级查询的介绍,在下篇文章中,我们会重点介绍 es 的性能调优!
文章内容难免会有些遗漏的地方,欢迎网友批评指出!
【纯干货】SpringBoot 整合 ES 进行各种高级查询搜索相关推荐
- SpringBoot操作ES进行各种高级查询(值得收藏)
来源:cnblogs.com/keatsCoder/p/11341835.html SpringBoot整合ES 创建SpringBoot项目,导入 ES 6.2.1 的 RestClient 依赖和 ...
- SpringBoot操作ES进行各种高级查询
SpringBoot整合ES 创建SpringBoot项目,导入 ES 6.2.1 的 RestClient 依赖和 ES 依赖.在项目中直接引用 es-starter 的话会报容器初始化异常错误,导 ...
- ElasticSearch系列 - SpringBoot整合ES:短语匹配查询 match_phrase
文章目录 1. ElasticSearch match_phrase查询是什么?它与match查询有什么区别? 2. ElasticSearch match_phrase 查询的语法是什么? 3. E ...
- SpringBoot 操作 ES 进行各种高级查询
点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...
- SpringBoot整合ES高级查询
SpringBoot整合ES高级查询 springboot版本:2.0.5.RELEASE elasticsearch版本:7.9.1 1.配置 引入依赖: <dependency>< ...
- Springboot整合ES
本文来说下Springboot整合ES的实战部分 文章目录 概述 概述
- springboot整合es启动报错的问题
今天打算用springboot整合es创建一个索引并往索引里面写数据的时候,项目启动的时候一直报下面的这个错误,错误大概如下, Caused by: org.springframework.beans ...
- 用SpringBoot整合ES数据库基础
一.SpringBoot整合ES数据库 1.配置原生的依赖. <properties><java.version>1.8</java.version><!-- ...
- Springboot整合ES,ES版不一致
本文记录的是:在Springboot整合ES中遇到的一些事 问题描述 最近想要提升自己的能力(其实就是被逼无奈),去学习了Elasticsearch:官方分布式搜索和分析引擎,在学完基础知识后(其实就 ...
最新文章
- 图神经网络(GNN)的简介
- Moodle网络课程上如何添加视频文件
- openssl生成自签证书
- 关于gradle加快构建速度采用阿里云中央仓库的配置
- boost::boyer_myrvold_params::kuratowski_subgraph用法的测试程序
- 【Java学习笔记五】Java异常处理
- wshttpbinding java_WCF自定义用户账号密码之WCF系结模式wsHttpBinding的Java调用
- 用配置还用Attribute来实现IoC?
- 02-NLP-04基于统计的翻译系统-03-短语翻译表构造——短语抽取
- android圆角视图_Android图库视图示例教程
- 《2018华为92家核心供应商及其供应产品》
- 练习 P1957 口算练习题
- DeskSpace 显示Dash board
- 计算机网络数据链路层
- JavaWeb开发切换皮肤技术
- 【UWP通用应用开发】编辑文本、绘制图形、3D透视效果及绘制时钟实战
- 太极图(JAVA实现)
- 二叉树叶子结点,非叶子节点以及深度的计算
- 用OpenCV计算图像的亚像素值
- Android系统工作资料被锁定,您需要知道的有关安卓屏幕锁定设置的所有内容
热门文章
- 基于SpringBoot监控Java项目,暴漏springboot内置端点
- OneR算法_0(python数据挖掘入门与实践-实验2)
- 低代码局中局:是IT革命还是高级外包? | 甲子光年
- linux 批量下载fnl,TMS370C356FNL
- 给TextView设置颜色选择器selector
- Debian虚拟机安装
- 综合练习2:购买电影票(代码区别:对象.成员方法)
- JSP实现注册并显示信息
- imx6ul gpio中断接收(代码)
- java coverage_Java Coverage(Cobertura)工具