SpringBoot 整合 ElasticSearch操作各种高级查询搜索

作者:鸭血粉丝Tang 时间:2023-03-25 17:12:40 

一、简介

在上篇 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 的性能调优!

来源:https://developer.51cto.com/article/710468.html

标签:SpringBoot,整合,ES,查询搜索,ElasticSearch
0
投稿

猜你喜欢

  • 详解微信小程序 同步异步解决办法

    2022-08-14 00:08:58
  • Taro打包Android apk过程详解

    2022-01-31 02:55:27
  • Java可重入锁的实现原理与应用场景

    2023-03-27 20:21:54
  • RegexOptions.IgnoreCase正则表达式替换,忽略大小写

    2022-05-03 17:25:45
  • 微信公众平台开发实战Java版之微信获取用户基本信息

    2023-06-02 23:05:50
  • Java中使用Lambda表达式和函数编程示例

    2022-05-06 03:30:40
  • JVM常量池的深入讲解

    2021-09-13 15:54:00
  • 三步轻松搭建springMVC框架

    2023-02-01 05:38:34
  • C#清除字符串内空格的方法

    2023-10-07 15:51:04
  • SpringBoot3.0自定stater模块的操作流程(chatGPT提供的49种场景)

    2023-06-15 05:21:46
  • 如何使用C#代码创建快捷方式文件详解

    2022-03-02 01:13:42
  • 基于Java8实现提高Excel读写效率

    2023-11-25 10:01:37
  • C#从DataTable获取数据的方法

    2022-09-16 03:20:59
  • 详解基于spring多数据源动态调用及其事务处理

    2023-06-23 14:37:25
  • Android仿微信联系人字母排序效果

    2021-10-01 16:06:25
  • C#将Word转换成PDF方法汇总(基于Office和WPS)

    2021-09-12 22:52:58
  • Java基本数据类型族谱与易错点梳理解析

    2021-08-18 10:20:27
  • IDEA实现添加 前进后退 到工具栏的操作

    2021-08-30 21:34:48
  • 论Java Web应用中调优线程池的重要性

    2023-06-13 04:56:27
  • java简单实现数组中的逆序对

    2022-06-26 02:23:17
  • asp之家 软件编程 m.aspxhome.com