You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:53:27