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

Spring Boot连接AWS OpenSearch报错需Elasticsearch6及以上版本

问题描述

在Spring Boot应用中集成AWS Elasticsearch(OpenSearch)服务时,按参考教程实现并做少量调整后,应用无法创建索引、无法与OpenSearch服务正常通信,启动时抛出Elasticsearch version 6 or more is required错误,多次尝试未解决。

项目相关配置与运行信息

1. Maven依赖配置

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-elasticsearch</artifactId>
    <version>1.12.244</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>2.7.0</version>
</dependency>
<dependency>
    <groupId>io.awspring.cloud</groupId>
    <artifactId>spring-cloud-starter-aws</artifactId>
    <version>2.4.1</version>
</dependency>

2. 父POM配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.0</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

3. application.yml配置

server:
port: 8087

spring:
  application:
  name: AWS ELK Demo

management:
  health:
  elasticsearch:
   enabled: false

cloud:
  aws:
  credentials:
    access-key: my-access-key
    secret-key: my-secret key
region:
  static: eu-central-1

注意:原配置YAML缩进存在错误,cloud.aws下的credentials、region层级未对齐,运行时会导致配置加载失败

4. Rest High-Level Client配置类

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.example.awselkdemo.repository")
public class ElasticSearchRestClientConfiguration  {
  
  @Bean
  public RestHighLevelClient client() {
    final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY,
            new UsernamePasswordCredentials("myuser", "myuser-password")
    );

    RestClientBuilder builder = 
       RestClient.builder(httpHost()).setHttpClientConfigCallback(
            httpClientBuilder -> httpClientBuilder
                    .setDefaultCredentialsProvider(credentialsProvider)
    );

    return new RestHighLevelClient(builder);
  }

  @Bean
  public ElasticsearchOperations elasticsearchTemplate() {
    return new ElasticsearchRestTemplate(client());
  }

  private HttpHost httpHost() {
    return new HttpHost(
            "search-my-test-cluster-jashsah67ashas.eu-central-1.es.amazonaws.com",
            443,
            "https"
    );
   }
 }

注意:配置类中声明的Repository扫描包路径为com.example.awselkdemo.repository,但异常栈中实际的Repository类位于com.bosch.awselkdemo.repository包下,包路径不匹配也会引发Bean创建异常

5. 启动异常栈信息

应用启动失败,核心报错为Elasticsearch version 6 or more is required,异常关键片段如下:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'photoRepository' defined in com.bosch.awselkdemo.repository.PhotoRepository defined in @EnableElasticsearchRepositories declared on ElasticSearchRestClientConfiguration: Invocation of init method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository]: Constructor threw exception; nested exception is org.springframework.data.elasticsearch.UncategorizedElasticsearchException: Elasticsearch version 6 or more is required; nested exception is ElasticsearchException[Elasticsearch version 6 or more is required]
...
Caused by: org.elasticsearch.ElasticsearchException: Elasticsearch version 6 or more is required
    at org.elasticsearch.client.RestHighLevelClient.performClientRequest(RestHighLevelClient.java:2701) ~[elasticsearch-rest-high-level-client-7.17.3.jar:7.17.3]

6. OpenSearch集群版本信息

直接访问集群端点返回信息显示,当前集群为OpenSearch 1.2.4版本:

{
"name": "5a8d2c313919cc9hjh3287ehje872",
"cluster_name": "3873287387:my-test-cluster",
"cluster_uuid": "shas_asjasihhjdjhq",
"version": {
"distribution": "opensearch",
"number": "1.2.4",
"build_type": "tar",
"build_hash": "unknown",
"build_date": "2022-04-18T07:00:42.948341Z",
"build_snapshot": false,
"lucene_version": "8.10.1",
"minimum_wire_compatibility_version": "6.8.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "The OpenSearch Project: https://opensearch.org/"
}
问题根因

报错和集群实际兼容能力无关,核心是客户端的硬编码校验逻辑问题:
当前引入的Elasticsearch 7.17.3版本RestHighLevelClient内置了版本校验规则,请求集群后会读取返回值里的version.number字段,只有识别到版本号属于Elasticsearch 6.x、7.x序列才会正常运行。对接OpenSearch 1.2.4集群时,客户端读取到的版本号为1.2.4,直接判定为版本低于6.0,就抛出了该错误。

解决方案
  • 优先选择替换为OpenSearch官方客户端(生产环境推荐)
    OpenSearch官方提供了适配Spring Data Elasticsearch的高版本客户端,完全兼容现有Spring Data Elasticsearch API,不需要修改业务逻辑:
    1. 移除原有Elasticsearch客户端依赖,引入OpenSearch官方适配依赖,版本和集群1.2.4版本对齐
    2. 调整配置类,将原有Elasticsearch RestHighLevelClient替换为OpenSearch对应的客户端,凭证、访问端点配置保持不变即可
    3. 同步修正YAML配置缩进、Repository扫描包路径两个配置错误
  • 临时兼容方案(仅用于测试环境)
    如果不想替换依赖,可以在RestClient的HTTP配置中添加响应拦截器,修改OpenSearch返回的版本字段:将distribution值改为elasticsearch,number值改为7.10.2(OpenSearch 1.x完全兼容ES 7.10.2版本API),绕过客户端的版本校验。该方案后续版本升级可能出现API不兼容问题,不建议生产使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:30:10