Elasticsearch 8.5版ElasticsearchClient#mSearch Java API迁移求助
Elasticsearch 8.5 多搜索API迁移指南(从7.17版本适配)
原7.17版本实现
MultiSearchRequest request = new MultiSearchRequest(); List<SearchRequest> searchRequests = getSearchRequests(); MultiSearchResponse multiSearchResponse = restClient.msearch(searchRequests, RequestOptions.DEFAULT);
问题描述
升级到8.5版本后,官方推荐使用ElasticsearchClient#mSearch(MsearchRequest request, Class<TDocument> tDocumentClass),但新API的MsearchRequest.Builder#searches(List<RequestItem> list)接收的RequestItem仅包含MultisearchHeader和MultisearchBody,无法直接复用原有SearchRequest对象,需要调整代码适配新结构。
适配方案
核心思路是把旧的SearchRequest拆解为新API要求的MultisearchHeader(元信息)和MultisearchBody(搜索条件),再组装成RequestItem。
1. 转换旧SearchRequest为RequestItem
import co.elastic.clients.elasticsearch.core.MsearchRequest; import co.elastic.clients.elasticsearch.core.msearch.MultisearchBody; import co.elastic.clients.elasticsearch.core.msearch.MultisearchHeader; import co.elastic.clients.elasticsearch.core.msearch.RequestItem; import co.elastic.clients.json.JsonData; import java.util.List; import java.util.stream.Collectors; // 获取原有SearchRequest列表 List<org.elasticsearch.action.search.SearchRequest> oldSearchRequests = getSearchRequests(); // 转换为新API的RequestItem列表 List<RequestItem> requestItems = oldSearchRequests.stream() .map(oldReq -> { // 构建Header:提取原请求的索引、路由等元信息 MultisearchHeader header = new MultisearchHeader.Builder() .index(oldReq.indices()) // 原请求的目标索引 .routing(oldReq.routing()) // 同步原请求的路由配置 .preference(oldReq.preference()) // 按需添加偏好设置等其他元信息 .build(); // 构建Body:把原SearchSourceBuilder转为JSON格式封装 MultisearchBody body = new MultisearchBody.Builder() .query(JsonData.fromJson(oldReq.source().toString())) .build(); // 组装成RequestItem return new RequestItem.Builder() .header(header) .body(body) .build(); }) .collect(Collectors.toList());
2. 构建MsearchRequest并发起请求
// 构建多搜索请求 MsearchRequest msearchRequest = new MsearchRequest.Builder() .searches(requestItems) .build(); // 发起请求,替换成你的实际文档类型 MsearchResponse<YourDocument> response = elasticsearchClient.msearch(msearchRequest, YourDocument.class); // 处理响应结果 for (MsearchResponse.Item<YourDocument> item : response.items()) { if (item.isError()) { // 处理单个子请求的错误 System.err.printf("子请求错误: %s%n", item.error().reason()); continue; } // 获取单个子请求的搜索结果 SearchResponse<YourDocument> searchResult = item.result(); // 遍历命中数据处理业务逻辑 searchResult.hits().hits().forEach(hit -> { YourDocument doc = hit.source(); // 此处编写文档处理逻辑 }); }
关键注意点
- 元信息完整迁移:
MultisearchHeader需要覆盖原SearchRequest中的所有必要元数据(如索引、路由、分片查询策略等),避免遗漏导致搜索行为不一致。 - 搜索条件转换:原
SearchSourceBuilder的toString()方法会生成符合Elasticsearch DSL的JSON字符串,通过JsonData.fromJson()可直接适配新API的MultisearchBody。 - 响应处理差异:新API的
MsearchResponse会逐个返回子请求的结果或错误,需遍历items()分别处理,逻辑和旧版本类似但类型结构不同。
内容的提问来源于stack exchange,提问作者Clemens
相关产品推荐
相关产品推荐

