SpringBoot 3.x 操作 ES 8.x 搜索案例
什么是新版的 ElasticSearch 的 Query 接口
Query 是 Spring Data Elasticsearch 的接口,有多种具体实现,新版官方文档缺少,这边看源码给案例实战

CriteriaQuery
- 创建 Criteria 来搜索数据,而无需了解 Elasticsearch 查询的语法或基础知识
- 允许用户通过简单地连接和组合,指定搜索文档必须满足的对象来构建查询
StringQuery
- 将 Elasticsearch 查询作为 JSON 字符串,更适合对 Elasticsearch 查询的语法比较了解的人
- 也更方便使用 kibana 或 postman 等客户端工具行进调试
NativeQuery
- 复杂查询或无法使用 CriteriaAPI 表达的查询时使用的类,例如在构建查询和使用聚合的场景
案例
案例一:搜索全部
java
/**
* 查询所有
*/
@Test
void searchAll(){
SearchHits<VideoDTO> search = restTemplate.search(Query.findAll(), VideoDTO.class);
List<SearchHit<VideoDTO>> searchHits = search.getSearchHits();
// 获得searchHits,进行遍历得到content
List<VideoDTO> videoDTOS = new ArrayList<>();
searchHits.forEach(hit -> {
videoDTOS.add(hit.getContent());
});
System.out.println(videoDTOS);
}案例二:匹配搜索
java
/**
* match查询
*/
@Test
void matchQuery(){
Query query = NativeQuery.builder().withQuery(q -> q
.match(m -> m
.field("description") //字段
.query("spring") //值
)).build();
SearchHits<VideoDTO> searchHits = restTemplate.search(query, VideoDTO.class);
// 获得searchHits,进行遍历得到content
List<VideoDTO> videoDTOS = new ArrayList<>();
searchHits.forEach(hit -> {
videoDTOS.add(hit.getContent());
});
System.out.println(videoDTOS);
}案例三:分页搜索
java
/**
* 分页查询
*/
@Test
void pageSearch() {
Query query = NativeQuery.builder().withQuery(Query.findAll())
.withPageable(Pageable.ofSize(3).withPage(0)) // 第一页从 0 开始
.build();
SearchHits<VideoDTO> searchHits = restTemplate.search(query, VideoDTO.class);
// 获得searchHits,进行遍历得到content
List<VideoDTO> videoDTOS = new ArrayList<>();
searchHits.forEach(hit -> {
videoDTOS.add(hit.getContent());
});
System.out.println(videoDTOS);
}案例四:搜索排序
withSort() 需要传入 Sort 对象,.by
- .ascending() 方法:默认的,正序排序
- .descending()方法:倒叙排序代表根据一个字段进行排序
java
/**
* 排序查询,根据时长降序排列
*/
@Test
void sortSearch() {
Query query = NativeQuery.builder().withQuery(Query.findAll())
.withPageable(Pageable.ofSize(10).withPage(0))
.withSort(Sort.by("duration").descending()).build();
SearchHits<VideoDTO> searchHits = restTemplate.search(query, VideoDTO.class);
// 获得searchHits,进行遍历得到content
List<VideoDTO> videoDTOS = new ArrayList<>();
searchHits.forEach(hit -> {
videoDTOS.add(hit.getContent());
});
System.out.println(videoDTOS);
}
朔风