使用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
相关产品推荐
相关产品推荐

