我可以在 Spring Bean 配置中为多个弹性搜索索引使用多个弹性搜索主机吗

Can I use multiple elastic search hosts in Spring Bean configuration for multiple elastic search indexes

我有一个 Java API 可以将文档插入到三个弹性索引中,并且可以正常工作。我想在 API 中更改一个索引的主机。通常,EsConfig 文件和 ElasticSearchTemplate 代码为 ;

public class EsConfig {
    @Value("${elasticsearch.host}")
    private String EsHost;
   @Value("${elasticsearch.port}")
   private int EsPort;
   @Value("${elasticsearch.clustername}")
   private String EsClusterName;

   @Bean
   public Client client() throws Exception {
      Settings settings = Settings.builder()
            .put("cluster.name", EsClusterName)
            //.put("index.max_result_window", 4000000)
            .build();

      TransportClient client = new PreBuiltTransportClient(settings)
            .addTransportAddress(new 
      TransportAddress(InetAddress.getByName(EsHost), EsPort));
      return client;
     }

     @Bean
     public ElasticsearchTemplate elasticsearchTemplate() throws Exception {
          ElasticsearchTemplate elasticsearchTemplate = new ElasticsearchTemplate(client());
          return elasticsearchTemplate;
      }

}

我想配置此结构以同时使用两个主机。这种结构是否可行,或者我应该完全更改并删除单例 bean 结构?

Elasticsearch 客户端 api 允许您以以下方式配置多个主机名,但遗憾的是,它们无法按预期工作。

据此LINK

The TransportClient connects remotely to an Elasticsearch cluster using the transport module. It does not join the cluster, but simply gets one or more initial transport addresses and communicates with them in round robin fashion on each action (though most actions will probably be "two hop" operations).

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new TransportAddress(InetAddress.getByName("host1"), 9300))
        .addTransportAddress(new TransportAddress(InetAddress.getByName("host2"), 9300));

您可以做的也许是继续实施 Profiles 的 Spring 引导概念,您可以在其中创建多个 application.properties。以下是实现此目的的方法之一。

如果我有两个不同的 hosts/environments 例如devprod,我最终会创建三个应用程序属性文件(两个用于环境,一个属性会提到您想要 select 的环境)。

申请-dev.properties

elasticsearch.clustername = mycluster_name
elasticsearch.host = mydev.abc.com          <-- Configure the name of host 1
elasticsearch.port = 9300

申请-prod.properties

elasticsearch.clustername = mycluster_name_2
elasticsearch.host = myprod.abc.com         <-- Configure the name of host 2
elasticsearch.port = 9300

application.properties

spring.profiles.active=dev                 <-- Configure which of the above properties do you want to start application with

现在,当您 运行 应用程序作为 spring 启动时,它最终会启动 dev 环境。

请注意,我假设这两个节点位于不同的集群中,而不是同一集群的一部分。我指定这个的原因是,如果 elasticsearch 收到 new/updated 文档,它会在内部继续更新其他节点的副本分片。在同一个集群中,您指向集群中的哪个主机并不重要。

如果这就是您要找的,请告诉我。