使用Spring Data JPA查询ES时出现ccs_minimize_roundtrips参数无法识别报错
问题根因
- 你当前使用的
spring-data-elasticsearch 3.2.3.RELEASE版本内置的Elasticsearch客户端,会默认在所有搜索请求中自动携带ccs_minimize_roundtrips参数,该参数仅Elasticsearch 6.7及更高版本的服务端支持,若服务端版本低于6.7就会触发该非法参数报错。 - 你提到的「服务端版本和API版本一致」可能存在匹配校验偏差,可执行
curl http://<ES服务地址>:9200,查看返回结果的version.number字段确认服务端实际运行版本。
解决方案
方案1:对齐服务端与客户端版本
将Elasticsearch服务端升级到6.7及以上版本,和当前客户端依赖的版本完全匹配即可直接解决报错。
方案2:过滤多余请求参数(无需改版本)
自定义RestHighLevelClient配置,添加请求拦截器移除ccs_minimize_roundtrips参数,代码示例如下:
import org.apache.http.HttpRequestInterceptor; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.RestClients; import org.elasticsearch.client.RestHighLevelClient; import java.util.stream.Collectors; @Configuration public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { @Value("${spring.elasticsearch.rest.uris}") private String[] esUris; @Override public RestHighLevelClient elasticsearchClient() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(esUris) .withHttpClientConfigurer(httpClientBuilder -> httpClientBuilder.addInterceptorFirst((HttpRequestInterceptor) (request, context, executor) -> { // 过滤掉不被服务端支持的ccs_minimize_roundtrips参数 request.getParams().keySet().stream() .filter("ccs_minimize_roundtrips"::equals) .collect(Collectors.toList()) .forEach(request::removeParam); return executor.execute(request, context); }) ) .build(); return RestClients.create(clientConfiguration).rest(); } }
方案3:降级Spring Data Elasticsearch版本
如果无法升级ES服务端,可将spring-data-elasticsearch依赖降级到3.1.x版本,该版本不会自动携带ccs_minimize_roundtrips参数,对应适配Spring Boot 2.1.x版本即可。
内容的提问来源于stack exchange,提问作者mahfuj asif
相关产品推荐
相关产品推荐

