Java High Level Rest Client多搜索API在Elasticsearch 8.3.2中无法使用
问题解决:Java HLRC 7.17.5对接ES8.3.2 Multi Search API报错
问题根源
ES 8.x版本彻底移除了文档类型(_type)的概念,而7.17.5的Java High Level Rest Client在构建MultiSearch请求时,会自动在每个子请求的元数据部分带上types字段,这在ES8.x中属于非法参数,即使开启API兼容模式也无法绕过这个限制。
解决方案
给每个SearchRequest显式设置空的类型数组,让客户端不再生成types相关的元数据字段:
修改后的代码如下:
SearchSourceBuilder metaDataSearch = new SearchSourceBuilder(); // 给SearchRequest添加空类型数组,避免生成types元数据 org.elasticsearch.action.search.SearchRequest metaSearch = new org.elasticsearch.action.search.SearchRequest() .source(metaDataSearch) .indices(indexName) .types(new String[0]); SearchSourceBuilder keywordExactRequestBuilder = new SearchSourceBuilder().size(10); keywordExactRequestBuilder.query(QueryBuilders.matchAllQuery()); // 同样给第二个SearchRequest设置空类型数组 org.elasticsearch.action.search.SearchRequest keywordExactRequestSearch = new org.elasticsearch.action.search.SearchRequest() .source(keywordExactRequestBuilder) .indices(indexName) .types(new String[0]); MultiSearchRequest multiSearchRequest = new MultiSearchRequest() .add(metaSearch) .add(keywordExactRequestSearch); MultiSearchResponse multiSearchResponse = null; try { multiSearchResponse = elasticClient.msearch(multiSearchRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); }
补充检查
如果上述修改后仍有问题,请确认你的RestHighLevelClient是否正确配置了ES7兼容请求头:
RestHighLevelClient elasticClient = new RestHighLevelClient( RestClient.builder(new HttpHost("your-es-host", 9200, "http")) .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.addInterceptorLast((HttpRequestInterceptor) (request, context) -> { // 添加兼容ES7的请求头 request.addHeader("Accept", "application/vnd.elasticsearch+json;compatible-with=7"); }) ) );
内容的提问来源于stack exchange,提问作者Sheik Syed
相关产品推荐
相关产品推荐

