您现在的位置是:亿华云 > 域名

SpringBoot 整合 ES 进行各种高级查询搜索

亿华云2025-10-03 06:16:02【域名】4人已围观

简介一、简介在上篇​​ SpringBoot 整合 ElasticSearch​​​ 文章中,我们详细的介绍了 ElasticSearch 的索引和文档的基本增删改查的操作方法!本文将重点介绍 ES 的各

一、整合简介

在上篇​​ SpringBoot 整合 ElasticSearch​​​ 文章中,进行我们详细的各种高级介绍了 ElasticSearch 的索引和文档的基本增删改查的操作方法!

本文将重点介绍 ES 的各种高级查询写法和使用。

SpringBoot 整合 ES 进行各种高级查询搜索

废话不多说,查询直接上代码!

SpringBoot 整合 ES 进行各种高级查询搜索

二、搜索代码实践

本文采用的整合SpringBoot版本号是2.1.0.RELEASE,服务端 es 的进行版本号是6.8.2,客户端采用的各种高级是云服务器官方推荐的Elastic Java High Level Rest Client版本号是6.4.2,方便与SpringBoot的查询版本兼容。

SpringBoot 整合 ES 进行各种高级查询搜索

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 的源码下载性能调优!

很赞哦!(42)