ElasticsearchRestTemplate的简单使用

前言

ElasticsearchRestTemplate是在springboot项目中使用elasticsearch资源的主要操作类。

依赖引入

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置文件

spring:
elasticsearch:
rest:
uris: http://127.0.0.1:9200
username: elastic
password: elastic

注意,如果es资源没有开启x-pack安全插件的话,可以不加username和password(因为默认是没有的)。

简单使用

查询

@RestController
@AllArgsConstructor
@RequestMapping("/es")
public class DemoController {
private ElasticsearchRestTemplate elasticsearchRestTemplate;
/**
* 简单查询
*
* @return 命中的数据
*/
@GetMapping("/list")
public List<ListDetailDTO> list() {
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
.filter(QueryBuilders.rangeQuery("receivedAt").from(0L).to(1657623337718L))
// .filter(QueryBuilders.termQuery("list.month", "202204"))
.filter(QueryBuilders.fuzzyQuery("_class", "dto"))
;
NativeSearchQuery build = new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.withPageable(PageRequest.of(1, 2))
.build();
SearchHits<ListDetailDTO> hits = elasticsearchRestTemplate.search(build, ListDetailDTO.class, IndexCoordinates.of("detail"));
if (CollectionUtil.isNotEmpty(hits.getSearchHits())) {
return hits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
}
return null;
}
/**
* 极值查询
*
* @return 极值
*/
@GetMapping("/analyze")
public SearchHits<ListDetailDTO> analyze() {
// 极值聚合查询
AvgAggregationBuilder avgBuilder = AggregationBuilders.avg("avg").field("list.water");
MaxAggregationBuilder maxBuilder = AggregationBuilders.max("max").field("list.water");
MinAggregationBuilder minBuilder = AggregationBuilders.min("min").field("list.water");
// 范围查询
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery("receivedAt").from(0L).to(1657723337718L));
// 拼接
NativeSearchQuery build = new NativeSearchQueryBuilder()
.addAggregation(avgBuilder)
.addAggregation(maxBuilder)
.addAggregation(minBuilder)
.withQuery(queryBuilder)
// 因为这个方法是范围查询并求极值,并不需要命中的数据,但是如果不加分页参数会返回所有命中的数据,注意,这里的size最小值不能为0
.withPageable(PageRequest.of(0, 1))
.build();
return elasticsearchRestTemplate.search(build, ListDetailDTO.class, IndexCoordinates.of("detail"));
}
}

分页查询只返回10000条数据问题解决

es官方默认限制索引查询最多只能查询10000条数据,查询第10001条数据开始就会报错:
Result window is too large, from + size must be less than or equal to
但是很多时候10000数据不能满足项目的需求,所以我们就要解除这个限制。
首先,修改es配置放开这个限制

PUT /index_name/_settings
{
"index.max_result_window": "20000000"
}

接着,在使用elasticsearchRestTemplate的时候还需要设置两个参数

NativeSearchQuery build = new NativeSearchQueryBuilder().build();
build.setTrackTotalHits(true); // 设置返回真实命中的数量
build.setMaxResults(2000000); // 设置返回最大结果数
posted @   大唐冠军侯  阅读(3239)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示