0

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

4

1 回答 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));

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

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

应用程序-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

应用程序属性

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

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

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

让我知道这是否是您正在寻找的。

于 2019-03-25T08:19:41.633 回答