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

时间:2019-03-23 09:17:59

标签: java elasticsearch indexing host spring-bean

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

1 个答案:

答案 0 :(得分: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

现在,当您以弹簧启动方式运行应用程序时,它将最终启动dev环境。

请注意,我假设这两个节点都位于不同的群集中,而不属于同一群集。我指定它的原因是,如果Elasticsearch收到新的/更新的文档,它将在内部继续进行并更新其他节点的副本分片。在同一群集中,您指向群集中的哪个主机都没有关系。

让我知道这是否是您想要的。