ElasticSearch 之 Client

在使用ElasticSearch的時候,咱們須要與Cluster通訊,Java版本的API提供了幾種方式來構造Client,進而經過Client操做Cluster。html

 
1)使用Node與clustor通訊
原理: 經過在程序中建立一個嵌入es節點(Node),使之成爲ElasticSearch集羣的一部分,而後經過這個節點來與ElasticSearch集羣通訊。
 
最簡單的方式:

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();      ???

2)使用TransportClient 與cluster通訊
 

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對象,應該使用單例複用。
相關文章
相關標籤/搜索