SpringBoot2.7.8用ElasticsearchClient替代RestHighLevelClient查询时NativeSearchQuery报错
解决ElasticsearchClient替代RestHighLevelClient后查询报错"unhandled Query implementation org.springframework.data.elasticsearch.core.query.NativeSearchQuery"
问题原因
Spring Boot 2.7.x对应的Spring Data Elasticsearch 4.4.x中,ElasticsearchTemplate是基于旧版RestHighLevelClient的实现类,而你传入的是新版ElasticsearchClient(Elasticsearch官方Java Client),两者并不兼容。NativeSearchQuery是为适配新版客户端的模板设计的,旧版ElasticsearchTemplate无法识别该查询类型,因此抛出错误。
解决方案
将配置中的ElasticsearchTemplate替换为ElasticsearchRestTemplate——这是Spring Data Elasticsearch中专门适配新版ElasticsearchClient的模板实现。
修改Bean配置
@Bean public ElasticsearchRestTemplate getElasticsearchRestTemplate( @Qualifier ElasticsearchClient elasticsearchClient, AddressMappingEsConverter addressMappingEsConverter) { return new ElasticsearchRestTemplate(elasticsearchClient, addressMappingEsConverter); }
依赖校验(可选)
Spring Boot 2.7.x会自动管理Elasticsearch相关依赖版本,确保项目中引入了正确的starter:
<!-- Maven示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
查询代码无需修改
你的现有查询逻辑可以直接与ElasticsearchRestTemplate兼容:
Query query = new NativeSearchQueryBuilder() .withQuery(booleanQueryBuilder) .withPageable(PageRequest.of(0, searchAddressRequest.getMaxRecordsRequested())) .build(); return elasticsearchOperations.search(query, SomeIndex.class);
额外提示
ElasticsearchTemplate在Spring Data Elasticsearch 4.x版本中已被标记为废弃,建议长期使用ElasticsearchRestTemplate或直接基于ElasticsearchOperations接口进行开发。- 确保
ElasticsearchClient的Bean配置包含正确的节点地址、认证信息等,避免后续出现连接类问题。
内容的提问来源于stack exchange,提问作者Akhil pattipati
相关产品推荐
相关产品推荐

