使用 Java API 连接到ElasticSearch集群的方法有两种。


1. 成为ElasticSearch节点

      第一种连接ElasticSearch节点的方式可能会让那些没有接触过ElasticSearch java API的人感到吃惊,即思路是把应用程序当成ElasticSearch集群中的一个节点,并和其他节点一样对待。当然(在绝大多数情况下),我们不希望自己的应用程序被当作数据节点来存储数据,或者被推选为主节点。

我们声明了Client接口、Node接口和NodeBuilder,并用他们来建立到ElasticSearch的连接。下面的代码片段创建了一个到客户端的实例:

Node node = NodeBuilder.nodeBuilder().clusterName(CLUSTERNAME).client(true).node();
Clientclient = node.client();

      我们使用NodeBuilder类创建了一个节点,其中NodeBuilder可根据需要配置并建立节点。集群名称很重要,我们可以通过clusterName( )方法指定它。如果没有提供集群名称,则NodeBuilder会使用默认名称,即(elasticsearch),这时你可能会连接到一个你不希望连接的集群。另一个要点是client()的调用,该方法可以把最终调用的节点指定为客户端节点,而客户端节点不会持有数据。这一点请务必谨慎对待,除非你知道你在做什么,如果忽略了,如果忽略了可能会引发各种奇怪的问题。你的集群可能会丢失部分或者全部的数据。事实上集群可能会把一部分数据迁移到你的电脑上,当你关闭本地的节点实例后,集群会发现一个节点挂了。当可以持有数据的客户端为多个时,索引会更容易丢失。比如说,如果索引没有副本,而部分索引分片又迁移到了你的电脑上,那么关闭客户端肯定会带来集群丢失部分索引。因此,请务必使用client(true),除非你真的知道你在干什么。

      另外需要说明一下local(true)方法。因为它的存在,ElasticSearch可以在当前虚拟机内作为一个独立的节点而存在。这意味着多个ElasticSearch节点可以并存于一个Java虚拟机进程内组成一个集群。这个功能在集成测试时非常好用。有了它我们不需要在其他的地方建立独立的测试节点,并确保了在多个并行测试中互不干扰。

2. 使用传输及连接方式

      本方法允许只连接到集群而不加入集群。你会发现,客户端可以连接到多个节点,并通过轮询调度的方式使用它们。

接下来是使用传输机连接的主要代码:

Settings settings = Settings.settingsBuilder()
    .put("cluster.name", CLUSTERNAME)
    .put("client.transport.sniff", true).build();
client = TransportClient.builder().settings(settings).build()
     .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), PORT))
     .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), PORT));

      这个方法很简单。首先我们使用方法settingsBuilder()来建立合适的配置对象,如在本例中只需设置好集群名称。接着我们使用这个配置对象来建立一个TransportClient的客户端对象,然后把连接点的网络地址传递给他。这可以通过TransportClient类的addTransportAddress()方法并传递InetSocketTransportAddress 对象来实现。为创建InetSocketTransportAddress对象,我们需要提供ElasticSearch节点多在机器的IP地址和节点传输层的监听端口号。注意,这里的端口号不是9200,而是9300。9200端口是用来让HTTP REST API来访问ElasticSearch,而9300端口是传输层监听的默认端口。

参数:

client.transport.sniff

true表示让客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中,这样做的好处是不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器

client.transport.ping_timeout

连接超时时间

client.transport.nodes_sampler_interval

心跳时间



3. 选择合适的连接方式

      目前你已经掌握了通过Java API方式连接ElasticSearch的两种方式:一种是建立客户端节点,一种是使用传输机客户端。到底哪种方式更好呢?一方面来说,第一种方式让启动顺序复杂化了,即客户端节点必须加入集群并建立与其它节点的连接,而这需要时间和资源。然而,操作可以更快地执行,因为所有关于集群、索引、分片的信息都对客户端节点可见。另一方面,使用TransportClient对象启动速度更快,需要的资源更少,如更少的socket连接。然而发送查询和数据却要消耗更多的资源,TransportClient对象对集群和索引的拓扑结构的信息一无所知,所以他无法把数据直接发送到正确的节点,而是先把数据发送给某个初始传输节点,然后由ElasticSearch来完成剩下的转发工作。此外,TransportClient对象还需要你提供一份待转发节点的网络地址列表。

      在选择合适的连接方式时请记住,第一种方式并不是总是可行的。例如,当要连接的ElasticSearch集群处于另一个局域网中,此时唯一可选的方式就是第二种方式。