ES 架构图
ES支持的客户端连接方式这种连接方式对应于架构图中的Transport这一层,这种客户端连接方式是直接连接ES的节点,使用TCP的方式进行连接.
java client 使用 TransportClient,各种操作本质上都是异步的(可以用 listener,或返回 Future )。
注意:ES的发展规划中在7.0版本开始将废弃 TransportClient,8.0版本中将完全移除 TransportClient,取而代之的是High Level REST Client。
High Level REST Client 中的操作API和java client 大多是一样的。
官方学习链接https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/index.html
加入依赖
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>6.2.4</version> </dependency>
初始化关键代码
public void init() { Settings settings = Settings.builder().put("client.transport.ignore_cluster_name", true) // .put("client.transport.sniff", true) // .put("cluster.name", "bdp-es-orderwaybill") .build(); try { transportClient = new PreBuiltTransportClient(settings); String[] hostAndPortArray = HTTP_URL.split(","); for (int i = 0; i < hostAndPortArray.length; i++) { String host = hostAndPortArray[i].split(":")[0]; String port = hostAndPortArray[i].split(":")[1]; // 6.x // transportClient.addTransportAddress(new TransportAddress(InetAddress.getByName(host), Integer.parseInt(port)) ); //5.x transportClient.addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName(host), Integer.parseInt(port)) ); httpHostList.add(hostAndPortArray[i]); } logger.info("Elasticsearch Java Transport Client init Successfully: {}", HTTP_URL); } catch (Exception e) { logger.error("Elasticsearch Java Transport Client init error: ", e); } }
初始化参数说明
cluster.name
指定集群的名字,如果集群的名字不是默认的elasticsearch,需指定。
client.transport.sniff
设置为true,将自动嗅探整个集群,自动加入集群的节点到连接列表中。
client.transport.ignore_cluster_name
Set to true to ignore cluster name validation of connected nodes. (since 0.19.4)
client.transport.ping_timeout
The time to wait for a ping response from a node. Defaults to 5s.
client.transport.nodes_sampler_interval
How often to sample / ping the nodes listed and connected. Defaults to 5s.
REST API 客户端这种连接方式对应于架构图中的RESTful style API这一层,这种客户端的连接方式是RESTful风格的,使用http的方式进行连接
ES提供了两个JAVA REST client 版本Java Low Level REST Client: 低级别的REST客户端,通过http与集群交互,用户需自己编组请求JSON串,及解析响应JSON串。兼容所有ES版本。
Java High Level REST Client: 高级别的REST客户端,基于低级别的REST客户端,增加了编组请求JSON串、解析响应JSON串等相关api。使用的版本需要保持和ES服务端的版本一致,否则会有版本问题。
Java Low Level REST Client 说明特点,maven 引入、使用绍: https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-low.html
API doc : https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-client/6.2.4/index.html .
Java High Level REST Client 说明从6.0.0开始加入的,目的是以java面向对象的方式来进行请求、响应处理。
每个API 支持 同步/异步 两种方式,同步方法直接返回一个结果对象。异步的方法以async为后缀,通过listener参数来通知结果。
高级java REST 客户端依赖Elasticsearch core project
兼容性说明:
依赖 java1.8 和 Elasticsearch core project
maven依赖
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.2.4</version> </dependency>初始化关键代码
public void init() { String[] hostAndPortArray = REST_HTTP_URL.split(","); HttpHost[] httpPosts = new HttpHost[hostAndPortArray.length]; for (int i = 0; i < hostAndPortArray.length; i++) { String host = hostAndPortArray[i].split(":")[0]; String port = hostAndPortArray[i].split(":")[1]; httpPosts[i] = new HttpHost(host, Integer.parseInt(port), SCHEMA); httpHostList.add(hostAndPortArray[i]); } RestClientBuilder builder = RestClient.builder(httpPosts); setConnectTimeOutConfig(builder); setMutiConnectConfig(builder); System.out.println("REST_HTTP_URL: " + REST_HTTP_URL); logger.info("Elasticsearch Java High Level REST Client init start!"); //6.x 以上 // restHighLevelClient = new RestHighLevelClient(builder); //5.x restClient = builder.build(); restHighLevelClient = new RestHighLevelClient(restClient); }