我有一个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,
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
。以下是实现这一目标的方法之一。
如果我有两个不同的主机/环境,例如dev
和prod
,我最终会创建三个应用程序属性文件(两个用于环境,一个属性可以提及您要选择的环境)。
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将在内部继续并更新其他节点的副本分片。在同一个集群中,您指向的集群中的哪个主机无关紧要。
如果这是您正在寻找的,请告诉我。