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

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

我有一个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结构?

java elasticsearch indexing host spring-bean
1个回答
0
投票

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

根据这个LINK

TransportClient使用传输模块远程连接到Elasticsearch集群。它不加入集群,而只是获取一个或多个初始传输地址,并在每个操作上以循环方式与它们通信(尽管大多数操作可能是“两跳”操作)。

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

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

如果我有两个不同的主机/环境,例如devprod,我最终会创建三个应用程序属性文件(两个用于环境,一个属性可以提及您要选择的环境)。

application-Dev.properties

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

application-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 boot运行时,它将最终启动dev环境。

请注意,我假设这两个节点都在不同的集群中,而不是同一集群的一部分。我指定这个的原因是因为,如果接收到新的/更新的文档,elasticsearch将在内部继续并更新其他节点的副本分片。在同一个集群中,您指向的集群中的哪个主机无关紧要。

如果这是您正在寻找的,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.