【纯干货】SpringBoot 整合 ES 进行各种高级查询搜索 您所在的位置:网站首页 springboot搜索功能 【纯干货】SpringBoot 整合 ES 进行各种高级查询搜索

【纯干货】SpringBoot 整合 ES 进行各种高级查询搜索

2023-12-08 00:32| 来源: 网络整理| 查看: 265

一、简介

在上篇 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 { @Autowired private RestHighLevelClient client; /** * 单条件精确查询 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 多条件精确查询,取并集 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 范围查询,包括from、to * @throws IOException */ @Test public 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 */ @Test public 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 */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 模糊查询,支持通配符 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 不使用通配符的模糊查询,左右匹配 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 多字段模糊查询 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 分页搜索 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 排序,字段的类型必须是:integer、double、long或者keyword * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 精确统计筛选文档数,查询性能有所降低 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 根据id精确匹配 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * matchAllQuery搜索全部 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * match搜索匹配 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * bool组合查询 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * nested类型嵌套查询 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 多条件查询 + 排序 + 分页 * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 聚合查询 sum * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 聚合查询 avg * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 聚合查询 count * @throws IOException */ @Test public 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 { @Autowired private RestHighLevelClient client; /** * 聚合查询 分组 * @throws IOException */ @Test public 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 的性能调优!

文章内容难免会有些遗漏的地方,欢迎网友批评指出!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有