在使用ElasticSearch的时候,咱们须要与Cluster通讯,Java版本的API提供了几种方式来构造Client,进而经过Client操做Cluster。html
Node node = NodeBuilder.nodeBuilder().node();java
Client client = node.client();node
配置cluster集群名称的方式:api
(1)配置文件里边配置:/src/main/resources/elasticsearch.yml 添加:cluster.name=yourclusternamejvm
(2)代码里边设置: Node node = NodeBuilder.nodeBuilder().clusterName("yourclustername").node();elasticsearch
默认的话启动一个节点,es集群会自动给它分配一些索引的分片, 此时可能会出现一些问题,例如:若是初始化Map的时候,须要分词插件,而本地又没有,就会报错。若是你想这个节点仅仅做为一个客户端而不去保存数据, 你就能够设置把node.data设置成false或node.client设置成true。如:NodeBuilder.nodeBuilder().client(true).node(); 此时,就不会出现上面的错误。ide
还有一种状况是你并不想把节点加入集群,只想用它进行单元测试时,就要启动一个”本地”的es,这里“本地”指的是在jvm的级别下运行,即两个不一样的es节点运行在同一个JVM中时会组成一个集群。它须要把节点的local参数设置成true单元测试
Node node = NodeBuilder.nodeBuilder().local(true).node(); ???
Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "xg-elasticsearch").put("client.transport.sniff", true).build();测试
TransportClient transportClient = new TransportClient(settings);ui
transportClient.addTransportAddress(new InetSocketTransportAddress("192.168.1.16", 9300));
cluster.name 表示:集群的名称,默认为 elasticsearch,能够在ElasticSearch对应的目录elasticsearch\config\下的elasticsearch.yml文件中修改。
若是设置client.transport.sniff为true,则表示客户端去嗅探整个cluster的状态,把集群中其它机器的ip地址加到客户端中,这样作的好处是通常你不用手动设置集群里全部集群的ip到链接客户端,它会自动帮你添加,而且自动发现新加入集群的机器。
可是至少添加一个InetSocketTransportAddress,不然会出现异常:org.elasticsearch.client.transport.NoNodeAvailableException: No node
available。这里给出了解释:https://groups.google.com/forum/#!topic/elasticsearch/TkEm068KJyo
意思就是至少手动添加一个节点,而 当client.transport.sniff 设置为true的时候,其作的是会把其它的在同一cluster中的其它的node添加进来。听说:同一cluster下的全部node须要在同一网段下面,待证明。
要注意的是:客户端和集群的cluster的版本须要一致。不然会出现不兼容的问题。
在使用过程当中,不要重复构造Client对象,应该使用单例复用。