要连接到集群,首先要告诉集群:你是谁,你有什么特征。在 ES 中体现为实例化节点。

ES 通过 org.elasticsearch.node.NodeBuilder 的 build() 或者 node() 方法实例化节点,build() 创建节点而不启动,而 node() 方法等价于 build().start() ,即 创建并启动。

 

首先实例化 NodeBuilder ,有两种方式,第一种是 new, 如下:

NodeBuilder nodeBuilder = new NodeBuilder();

 

第二种使用 NodeBuilder 的工厂方法,NodeBuilder 中有以下方法

public static NodeBuilder nodeBuilder(){
 return new NodeBuilder();
}

所以可以直接通过以下代码实例化 NodeBuilder:

NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder();

实例化后便可设置该 node 的特性,NodeBuilder 本身自带了一些方法:

1、loadConfigSettings ,是否家在配置文件。

你可以在 classpathx 下 创建一个 elasticsearch.yml 文件,然后再其中设置一些属性(参见分布式搜索Elasticsearch——配置) ,再把 loadConfigSettings 的值设置为 true 即可,代码如下

NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().loadConfigSettings(true);

loadConfigSettings 默认为 true.

2、是否只作为客户端,即不存储索引数据,默认值为false 代码如下所示:

NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().client(true);

3、是否持有索引数据,默认值为 true,代码如下所示:

NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().data(true);

client(boolean) 和 data(boolean) 是有一定关联的,

当 client 为 true 时候, data 默认值为 false,且不能改为 true,否则会报错。

当 client 为 false 时候,data 默认值为 true,而且改为 false 也不起作用,也就是下面代码等价:

NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().data(true).client(false);  
NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().data(false).client(false);

 4、是否为 本地节点,本地节点是指在 JVM 级别中的统计,当多个节点使用同一个 JVM 时,这些节点可以组合成一个集群,而非同一个 JVM 下的节点则不处于集群中,默认值为 false:

NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().local(true);

5、设置集群名,即该节点位于哪个集群下,默认值elasticsearch:

NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().clusterName(your name");

若多个节点设置了同一个 clusterName,则说明这几个节点位于同一个集群下。

6、以 Map 的方式设置属性,NodeBuilder 中有以下两个方法:

    

/**
 * Explicit node settings to set
 */
public NodeBuilder settings(Settings.Builder settings){
  return settings(settings.build());
}

/**
 * Explicit node settings set
 */
public NodeBuilder settings(Settings settings){
  this.settings.put(settings);
  return this;
}

这两个方法允许通过 Map 的方法设置属性,如下代码所示:

Map<String,String> settingsMap = new HashMap<String,String>();
settingsMap.put("node.client","false");
settingsMap.put("node.data","true");
settingsMap.put("node.local","true");
settingsMap.put("cluster.name","clusterName");
settingsMap.put("node.name","geloin");

Settings settings = ImmutableSettings.settingsBuilder().put(settingsMap).build();
Node node = NodeBuilder.nodeBuilder().settings(settings).node();

org.elasticsearch.common.settings.Settings 是一个接口,

org.elasticsearch.common.settings.ImmutableSettings 才是它的实现类。

上一篇文章 分布式搜索 Elasticsearch —— 配置 说了一些 ES 的配置,可以在上述的代码中的 map 中设置。

 

综上所述,我们对设置 Node 的属性有以下结论:

1、使用配置文件,即在 classpath 下建立 elasticsearch.yml 文件,然后把 分布式搜索 Elasticsearch —— 配置 李曼提到的配置加入到此文件中,再保持 loadConfigSettings为 true 即可;

2、使用 Map 方式,然后用  NodeBuilder.nodeBuilder().settings(settings);

3、使用 NodeBuilder 自带了 client 、data、local、clusterName 方法,不过 NodeBuilder 自带方法有限,所以可能还需要配合以上提到的两种方式才能达到要求。