1、創建客戶端節點來連接:
其中client(true)將node指定為客戶端節點,所以這個不能寫漏掉,客戶端節點是不持有數據的,
- Node node = NodeBuilder.nodeBuilder().clusterName(clusterName).client(true)
- .node();
- Client client = node.client();
優勢:
通過此方式創建客戶端能知道所有關於集群、索引、分片的信息,在操作上可以更快的執行。
不足之處:
啟動時客戶端節點必須加入集群並建立與其他節點的連接,此過程需要消耗時間和資源。
當ES集群處於另一個局域網中時就不行了,所以一般不建議使用此方式。
2、使用傳輸機客戶端來連接(即使用TransportClient來創建):
- Settings settings = Settings.builder().put("cluster.name",clusterName).build();
- client = TransportClient.builder().settings(settings).build();
- client.addTransportAddress(new InetSocketTransportAddress(
- InetAddress.getByName(host), port));
優勢:
啟動速度快,不需要像前者那么多的socket連接。
不足之處:
因為它不想前者那樣知道集群、索引、分片的這些信息,所以在分發數據和查詢上沒前者快,不能直接發送到指定的節點或直接從某個節點去取數據,需要ES在其中進行一些額外的轉發才能完成。
TransportClient類的可用配置:
client.transport.sniff:默認值為false,當設置為true時,ES會讀取集群中的節點信息。
client.transport.ignore_cluster_name:默認值為false,當設置為true時,ES會忽視配置中的集群名稱並嘗試連接到某個可連接集群上,而不管集群名稱是否匹配。
client.transport.ping_timeout:默認為5s,此參數指定了ping命令響應的超時時間。
client.reansport.nodes_sampler_interval:默認為5s,此參數指定了檢查節點可用性的時間間隔。