升级Spring Boot至3.1.3后MultiSearchResponse类找不到问题咨询
Spring Boot 3.1.3 + Elasticsearch 8.7.1 中 MultiSearchResponse 类的替代方案
类变动原因
Elasticsearch 8.x 版本正式废弃了High Level REST Client(HLRC),而org.elasticsearch.action.search.MultiSearchResponse正是HLRC中的核心类,因此在8.7.1版本中被移除。Spring Boot 3.x 对应的spring-boot-starter-data-elasticsearch默认使用Elasticsearch 8.x的新Java Client(包路径为co.elastic.clients.elasticsearch),这就是你找不到该类的根本原因。
代码修改步骤
1. 清理旧依赖
如果你的项目中手动引入了HLRC的依赖,比如:
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>
直接删除该依赖,spring-boot-starter-data-elasticsearch已经包含了新的Java Client,无需额外引入。
2. 替换MultiSearch相关代码
用新Java Client的MsearchRequest和MsearchResponse替代旧的MultiSearchRequest和MultiSearchResponse,以下是具体示例:
旧代码(HLRC方式)
import org.elasticsearch.action.search.MultiSearchRequest; import org.elasticsearch.action.search.MultiSearchResponse; import org.elasticsearch.client.RestHighLevelClient; // 构建多搜索请求 MultiSearchRequest request = new MultiSearchRequest(); request.add(new SearchRequest("index1").source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()))); request.add(new SearchRequest("index2").source(new SearchSourceBuilder().query(QueryBuilders.termQuery("field", "value")))); // 执行请求 MultiSearchResponse response = restHighLevelClient.msearch(request, RequestOptions.DEFAULT); // 处理结果 for (MultiSearchResponse.Item item : response.getResponses()) { if (!item.isFailure()) { SearchResponse searchResponse = item.getResponse(); // 处理单个搜索结果 } }
新代码(Elasticsearch Java Client方式)
import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch.core.MsearchRequest; import co.elastic.clients.elasticsearch.core.MsearchResponse; import co.elastic.clients.elasticsearch.core.search.Hit; // 注入Spring自动配置的ElasticsearchClient @Autowired private ElasticsearchClient elasticsearchClient; // 构建多搜索请求 MsearchRequest request = new MsearchRequest.Builder() .searches(s -> s.index("index1").query(q -> q.matchAll(m -> m))) .searches(s -> s.index("index2").query(q -> q.term(t -> t.field("field").value("value")))) .build(); // 执行请求 MsearchResponse<YourEntity> response = elasticsearchClient.msearch(request, YourEntity.class); // 处理结果 for (MsearchResponse.Item<YourEntity> item : response.responses()) { if (item.result().isPresent()) { // 获取单个搜索结果 var searchResult = item.result().get(); for (Hit<YourEntity> hit : searchResult.hits().hits()) { YourEntity entity = hit.source(); // 处理实体数据 } } }
3. 注意事项
- 新Java Client基于Jackson序列化,确保你的实体类符合Jackson的序列化规则,或使用Elasticsearch提供的
@JsonProperty等注解调整字段映射。 - 如果不需要绑定到实体类,可以用
MsearchResponse<Object>或直接处理原始JSON。 - Spring Boot 3.x会自动配置
ElasticsearchClient,无需手动创建,直接注入即可使用。
内容的提问来源于stack exchange,提问作者du-it
相关产品推荐
相关产品推荐

