為什么80%的碼農都做不了架構師?>>> ??
要連接到集群,首先要告訴集群:你是誰,你有什么特征。在 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 自帶方法有限,所以可能還需要配合以上提到的兩種方式才能達到要求。