一、文档
High Level Rest Client基于Low Level Rest Client工作,它的主要目的是暴露具体的api方法,以参数的形式接受请求对象并返回一个响应对象。
每一个API可以异步或同步调用,同步方法返回一个响应对象(response object);异步方法以async结尾,需要一个监听器参数(线程管理池使用的是Low Level Rest Client功能)通知相应或者接受异常。
High Level Rest Client依赖于Elasticsearch Core,可以接受 TransportClient相同请求参数和返回相同相应对象。
高级客户端需要Java 1.8并依赖于Elasticsearch core项目。 客户端版本需要与Elasticsearch版本相同。 它与TransportClient请求的参数和返回响应对象相同。
要能够与Elasticsearch进行通信,主版本号需要一致,次版本号不必相同,因为它是向前兼容的。次版本号小于等于elasticsearch的都可以。这意味着它支持与更高版本的Elasticsearch进行通信。
6.0客户端能够与任何6.x Elasticsearch节点通信,而6.1客户端肯定能够与6.1,6.2和任何后来的6.x版本进行通信,但与旧版本的Elasticsearch节点通信时可能会存在不兼容的问题,例如6.1和6.0之间,可能6.1客户端支持elasticsearch 6.0还没出来的API。
建议在将Elasticsearch集群升级到新的主要版本时升级高级客户端,因为REST API中断更改可能会导致意料之外的结果,具体取决于请求所击中的节点,以及新添加的API只能被更新的客户端版本支持。应该在群集中的所有节点都升级到新的主要版本之后,客户端才更新。
高级客户端托管在Maven Central上。所需的最低Java版本是1.8。高级客户端与Elasticsearch的发布周期相同。
添加maven依赖,版本选择相对应的elasearch版本
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.1.4</version> </dependency>
任何主要版本(像beta版)的第一个版本可能都是在Lucene Snapshot版本之上构建的。在这种情况下,您将无法解析客户端的Lucene依赖关系。
例如,如果您想使用依赖于Lucene 7.0.0-snapshot-00142c9的6.0.0-beta1版本,您必须定义以下repository。
<repository> <id>elastic-lucene-snapshots</id> <name>Elastic Lucene Snapshots</name> <url>http://s3.amazonaws.com/download.elasticsearch.org/lucenesnapshots/00142c9</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>false</enabled></snapshots> </repository>
除此之外,还需要其他的依赖关系
- org.elasticsearch.client:elasticsearch-rest-client
- org.elasticsearch:elasticsearch
RestHighLevelClient实例需要Rest low-level client builder构建,代码如下
RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http")));
high-level client根据提供的builder内部创建 low-level client ,并管理其生命周期
当不再需要时,需要关闭高级客户端实例,以便它所使用的所有资源以及底层的http客户端实例及其线程得到正确释放。可以通过close方法来完成,该方法将关闭内部的RestClient实例。
client.close();
二、动手
我的es版本是5.6.3,我一开始用的restclient版本也是5.6.3,写代码过程中发现很多区别,比如创建RestHighLevelClient时5.6.3穿入的是RestClient,而6.1传入的是RestClient.Builder。5.6.3版本没有close方法,6.1有close方法,目前没去看源码,不清楚5.6.3怎么处理的使用后的资源,可能是每次使用后回收资源。
maven引入,目前实验最新版本6.1.4对es5.6.3还算友好,这里用的6.1.4版本
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>5.6.3</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>6.1.4</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.1.4</version> </dependency>
创建client
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, //es账号密码 new UsernamePasswordCredentials(ES_USER_NAME, ES_PWD)); try { client = new RestHighLevelClient( //传入RestClientBuilder RestClient.builder( new HttpHost(host, port) ).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() { public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) { //这里可以设置一些参数,比如cookie存储、代理等等 httpClientBuilder.disableAuthCaching(); return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); } }).setMaxRetryTimeoutMillis(2000) ); }catch (Exception e) { //示例方法,不处理异常 e.printStackTrace(); }
测试代码
GetRequest getRequest = new GetRequest("index", "log", "3"); GetResponse response = client.get(getRequest); Map<String, Object> fields = response.getSource(); for(Map.Entry<String, Object> entry : fields.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); }
测试结果