spring-data-elasticsearch 中与 hlrc 的兼容模式

问题描述 投票:0回答:2

我目前正在制作我们的 hlrc,我们已经使用 spring-data-elasticsearch: 4.4.18 配置了它,与我们新的 ES8 集群兼容。我在here找到了此迁移指南,但是使用我当前的客户端配置进行设置并不那么容易,因为我们当前使用的不是 RestHighLevelClientBuilder 而是 ClientConfiguration.TerminalClientConfigurationBuilder ,它不提供此方法。不幸的是,我对这些客户端也缺乏经验,这就是为什么我希望在这里获得一些帮助,了解如何使用当前配置将兼容模式设置为 true 以便可以进行通信。高层集群的通信是否存在其他已知问题?

如果能提供一点帮助,将不胜感激。 :)

    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {

        ClientConfiguration.TerminalClientConfigurationBuilder clientConfigurationBuilder =
          ClientConfiguration.builder()
            .connectedTo(env.getProperty("elastic.serverUrl") + ":" + env.getProperty("elastic.serverPort"))
            .withBasicAuth(env.getProperty("elastic.user"), env.getProperty("elastic.password"))
            .withConnectTimeout(11 * 000).withSocketTimeout(20 * 000);

        Boolean disableSsl = Boolean.valueOf(env.getProperty("elastic.disableSsl"));
        if (!disableSsl) {
            ((ClientConfiguration.MaybeSecureClientConfigurationBuilder) clientConfigurationBuilder).usingSsl();
        }

        return RestClients.create(clientConfigurationBuilder.build()).rest();
    }
}
spring-data-elasticsearch resthighlevelclient elasticsearch-high-level-restclient
2个回答
0
投票

我查看了旧的 Elasticsearch 代码,除了来自

RestHighLevelClientBuilder
的调用之外,似乎还有另一种可能性来设置 api 兼容模式:

    public static final String API_VERSIONING_ENV_VARIABLE = "ELASTIC_CLIENT_APIVERSIONING";



        if (useAPICompatibility == null && "true".equals(System.getenv(API_VERSIONING_ENV_VARIABLE))) {
            this.useAPICompatibility = true;
        } else {
            this.useAPICompatibility = Boolean.TRUE.equals(useAPICompatibility);
        }

因此您可以尝试将应用程序的环境变量

ELASTIC_CLIENT_APIVERSIONING
设置为
true

但是 - 当您使用 Elasticsearch 版本 8 时 - 将应用程序升级到与其兼容的 Spring Data Elasticsearch 版本可能更有意义。

4.4.x 已于 2023 年 5 月终止支持,自 2022 年 11 月推出 Spring Data Elasticsearch 5 以来,Elastisearch 8 成为默认版本。


0
投票

感谢 P.J.Meisch 抽出时间!我将客户端的配置更改为以下内容。你觉得上一篇可能有问题吗?

是的,我知道这可能是将 spring-data-elasticsearch 更改为较新版本的更好方法,其中还包括迁移到 Spring Boot 3.x,但不幸的是我们的整个技术堆栈已经过时,并且此迁移将花费太长时间目前,我们正在寻找一种解决方案,使我们当前的堆栈能够与新的 ES8 集群一起运行。现在出现的唯一问题是控制台中的此错误:

init方法调用失败;嵌套异常是 java.lang.annotation.AnnotationTypeMismatchException:不正确 找到注释元素公共摘要的类型化数据 org.springframework.data.elasticsearch.annotations.DateFormat[] org.springframework.data.elasticsearch.annotations.Field.format() (找到的数据类型 Lorg/springframework/data/elasticsearch/annotations/DateFormat;.basic_date_time)

我们仍在使用 java.util.Date 库,这可能是问题所在,您认为如何?

 @Override
            @Bean
            public RestHighLevelClient elasticsearchClient() {
                RestClientBuilder builder = RestClient.builder(
                                new HttpHost(env.getProperty("elastic.serverUrl.es8"),
                                        Integer.parseInt(env.getProperty("elastic.serverPort.es8")),
                                        Boolean.valueOf(env.getProperty("elastic.disableSsl")) ? "http" : "https"))
                        .setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder
                                .setConnectTimeout(10 * 1000)
                                .setSocketTimeout(30 * 1000))
                        .setHttpClientConfigCallback(httpClientBuilder -> {
                            httpClientBuilder.setDefaultCredentialsProvider(
                                    new BasicCredentialsProvider() {{
                                        setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(
                                                env.getProperty("elastic.user.es8"), env.getProperty("elastic.password.es8")));
                                    }}
                            );
    
                            if (!Boolean.valueOf(env.getProperty("elastic.disableSsl"))) {
                                try {
                                    httpClientBuilder.setSSLContext(SSLContext.getDefault());
                                } catch (NoSuchAlgorithmException e) {
                                    throw new RuntimeException(e);
                                }
                            }
    
                            return httpClientBuilder;
                        });
    
                RestHighLevelClient client = new RestHighLevelClientBuilder(builder.build())
                        .setApiCompatibilityMode(true)
                        .build();
    
                return client;
            }
© www.soinside.com 2019 - 2024. All rights reserved.