我目前正在制作我们的 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();
}
}
我查看了旧的 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 成为默认版本。
感谢 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;
}