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

使用RestHighLevelClient的msearch报types不支持错误如何解决?

问题解决:MultiSearchRequest报types不支持错误

错误原因

该错误源于你的Elasticsearch服务版本为7.x及以上(此版本已彻底移除文档类型_type的支持),但通过MultiSearchRequest发送请求时,客户端自动在请求元数据中加入了types字段,导致服务端拒绝请求。而单独使用count接口时,客户端不会添加该字段,因此能正常运行。

解决方案

1. 确保客户端与服务端版本匹配

先检查elasticsearch-rest-high-level-client的版本是否和ES服务版本完全一致,版本不匹配极易引发这类兼容性问题。

2. 修改SearchRequest构建逻辑

创建SearchRequest时,显式清空类型参数,避免客户端自动添加types字段。修改后的multiCount方法如下:

public Map<String, Object> multiCount(List<String> indices, QueryBuilder query) throws IOException {
    List<SearchRequest> requests = new ArrayList<>();
    for (String index : indices) {
        SearchRequest searchRequest = new SearchRequest(index);
        // 显式设置空类型数组,避免客户端自动注入types字段
        searchRequest.types(new String[0]);
        searchRequest.source(new SearchSourceBuilder().query(query).size(0));
        requests.add(searchRequest);
    }
    MultiSearchRequest multiSearchRequest = new MultiSearchRequest();
    requests.forEach(multiSearchRequest::add);
    MultiSearchResponse response = client.msearch(multiSearchRequest, RequestOptions.DEFAULT);
    List<Integer> countResults = new ArrayList<>();
    for (MultiSearchResponse.Item item : response.getResponses()) {
        if (item.isFailure()) {
            throw new IOException("Error in multi count request: " + item.getFailureMessage());
        } else {
            SearchResponse searchResponse = item.getResponse();
            countResults.add((int) searchResponse.getHits().getTotalHits().value);
        }
    }
    return Collections.singletonMap("counts", countResults);
}

3. 替代方案:使用MultiCountRequest(版本兼容时可用)

如果你的ES版本仍支持MultiCountRequest(7.x中已标记为废弃,8.x彻底移除),可直接用该接口实现多索引计数,规避msearch的类型问题:

public Map<String, Object> multiCount(List<String> indices, QueryBuilder query) throws IOException {
    MultiCountRequest multiCountRequest = new MultiCountRequest();
    for (String index : indices) {
        CountRequest countRequest = new CountRequest(index);
        countRequest.source(new SearchSourceBuilder().query(query));
        multiCountRequest.add(countRequest);
    }
    MultiCountResponse response = client.mcount(multiCountRequest, RequestOptions.DEFAULT);
    List<Integer> countResults = new ArrayList<>();
    for (MultiCountResponse.Item item : response.getResponses()) {
        if (item.isFailure()) {
            throw new IOException("Error in multi count request: " + item.getFailureMessage());
        } else {
            countResults.add((int) item.getCount());
        }
    }
    return Collections.singletonMap("counts", countResults);
}

注意:MultiCountRequest属于旧版接口,推荐优先使用第一种方案适配ES新版本。

内容的提问来源于stack exchange,提问作者uyarc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:32:12