如何将多个弹性搜索连接添加到 Spring 引导项目?

How to add multiple elastic search connections to a Spring Boot project?

我有 2 个弹性搜索服务器,我需要将连接添加到 spring 引导项目。对于一个连接,以下是我的代码,

@Configuration
@EnableElasticsearchRepositories(basePackages = {"packageName"})
public class ES {

    @Bean
    public RestHighLevelClient client() {
        CredentialsProvider cp = new BasicCredentialsProvider();
        cp.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("username", "password"));

        return new RestHighLevelClient(RestClient.builder(new HttpHost("host", "port", "https"))
                        .setHttpClientConfigCallback(httpAsyncClientBuilder -> httpAsyncClientBuilder.setDefaultCredentialsProvider(cp)
                                        .setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy())));
    }
}

那么如何添加其他服务器连接呢?如果我复制此 class 并添加其他服务器连接详细信息,它会起作用吗?而且我还需要分开索引。我的意思是,例如我需要索引 entity1 必须仅在 server 1 中,索引 entity2 必须仅在 server 2 中。那可能吗?如果有人能帮助我,我将不胜感激。

如果两台服务器属于同一个 ES 集群,RestClient.builder 接受要连接的 HttpHost 数组。客户端(底层是 ES 低级 REST 客户端)将对这些主机进行循环请求。

More info

目前 Spring Data Elasticsearch 无法做到这一点。存储库使用 Spring 上下文提供的 ElasticsearchOperations bean,而此 bean 使用配置的 RestHighLevelClient。无法配置到不同集群的多个连接。

编辑:

您可以使用 beans 将一个连接配置为默认连接,然后您可以使用此注入作为 ElasticsearchOperations 并由存储库方法使用。

对于第二个连接,您需要像您已经做的那样创建一个新的 RestHighLevelClient,然后创建一个额外的 ElasticsearchRestTemplate 传递给第二个客户端;使用注入的 ElasticsearchConverter 作为第二个构造函数参数。您可以在 org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration 中查看代码是如何完成的。

使用第二个 ElasticsearchOperations 实例,您可以针对第二个集群进行操作,但您必须使用此接口的方法,而不能为此使用存储库方法。