ElasticSearch 之 Client


在使用ElasticSearch的時候,我們需要與Cluster通信,Java版本的API提供了幾種方式來構造Client,進而通過Client操作Cluster。

 
1)使用Node與clustor通信
原理: 通過在程序中創建一個嵌入es節點(Node),使之成為ElasticSearch集群的一部分,然后通過這個節點來與ElasticSearch集群通信。
 
最簡單的方式:

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

2)使用TransportClient 與cluster通信
 

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對象,應該使用單例復用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM