Spring Data ElasticSearch升级:查询移除方法的变更日志与替代方案
Spring Data Elasticsearch 4.X 升级相关问题解答
1. NativeSearchQueryBuilder.withIndices() 方法变更
移除背景
Spring Data Elasticsearch 4.0 开始适配 Elasticsearch 7.x+ 版本,而 Elasticsearch 7.x 已逐步废弃索引类型(type),因此官方重构了查询构建器的索引指定逻辑,withIndices() 及配套的 withTypes() 方法被直接移除,将索引指定逻辑从查询构建器剥离。
替代方案
有两种常用替代方式:
- 通过模板执行时指定索引
使用 4.x 推荐的ElasticsearchRestTemplate执行查询时,直接传入索引坐标:NativeSearchQuery query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchAllQuery()) // 示例查询条件 .build(); // 执行查询时指定目标索引 SearchHits<YourEntity> hits = elasticsearchRestTemplate.search(query, YourEntity.class, IndexCoordinates.of("your-target-index")); - 通过实体类注解绑定默认索引
在实体类上用@Document注解指定索引名,查询时模板会自动关联该索引:@Document(indexName = "your-default-index") public class YourEntity { // 实体字段定义 } // 无需手动指定索引,模板自动使用注解配置 NativeSearchQuery query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.termQuery("field", "value")) .build(); SearchHits<YourEntity> hits = elasticsearchRestTemplate.search(query, YourEntity.class);
2. ElasticsearchTemplate.query() 方法相关情况
Spring Data Elasticsearch 4.x 中,ElasticsearchTemplate 基于已被 Elasticsearch 废弃的 TransportClient 实现,因此包括 query() 在内的大部分 API 被标记为废弃状态。
官方推荐使用 ElasticsearchRestTemplate 作为替代,对应 query() 方法的功能可以通过以下方式实现:
- 常规查询场景:使用
search()方法结合结果流处理:NativeSearchQuery query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.rangeQuery("createTime").gte("2024-01-01")) .build(); List<YourEntity> results = elasticsearchRestTemplate.search(query, YourEntity.class) .stream() .map(SearchHit::getContent) .collect(Collectors.toList()); - 自定义结果映射场景:传入自定义
SearchResultMapper处理原始响应:SearchHits<YourEntity> hits = elasticsearchRestTemplate.search(query, YourEntity.class, indexCoordinates, new CustomResultMapper()); - 原生API调用:如果需要完全自定义查询逻辑,可通过
elasticsearchRestTemplate.getClient()获取RestHighLevelClient,直接调用 Elasticsearch 官方原生API。
内容的提问来源于stack exchange,提问作者BS NB
相关产品推荐
相关产品推荐

