在使用ElasticSearch的時候,我們需要與Cluster通信,Java版本的API提供了幾種方式來構造Client,進而通過Client操作Cluster。
Node node = NodeBuilder.nodeBuilder().node();
Client client = node.client();
配置cluster集群名稱的方式:
(1)配置文件里邊配置:/src/main/resources/elasticsearch.yml 添加:cluster.name=yourclustername
(2)代碼里邊設置: Node node = NodeBuilder.nodeBuilder().clusterName("yourclustername").node();
默認的話啟動一個節點,es集群會自動給它分配一些索引的分片, 此時可能會出現一些問題,例如:如果初始化Map的時候,需要分詞插件,而本地又沒有,就會報錯。如果你想這個節點僅僅作為一個客戶端而不去保存數據, 你就可以設置把node.data設置成false或node.client設置成true。如:NodeBuilder.nodeBuilder().client(true).node(); 此時,就不會出現上面的錯誤。
還有一種情況是你並不想把節點加入集群,只想用它進行單元測試時,就要啟動一個”本地”的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);
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對象,應該使用單例復用。