Elasitcsearch High Level Rest Client学习笔记(一)

文档地址:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.1/java-rest-high.htmlhtml

java doc地址: https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-high-level-client/6.1.4/index.html.java

基于文档翻译理解及我的代码分享,做为学习笔记,根据学习进度更新api

前半段根据文档翻译理解,后半段我本身代码。我本身搭建了三节点elasticsearch集群,版本5.6.3,代码也会基于5.6.3版本,插件:head、kibana、x-packcookie

 

1、文档异步

High Level Rest Client基于Low Level Rest Client工做,它的主要目的是暴露具体的api方法,以参数的形式接受请求对象并返回一个响应对象。async

每个API能够异步或同步调用,同步方法返回一个响应对象(response object);异步方法以async结尾,须要一个监听器参数(线程管理池使用的是Low Level Rest Client功能)通知相应或者接受异常。elasticsearch

High Level Rest Client依赖于Elasticsearch Core,能够接受 TransportClient相同请求参数和返回相同相应对象。maven

高级客户端须要Java 1.8并依赖于Elasticsearch core项目。 客户端版本须要与Elasticsearch版本相同。 它与TransportClient请求的参数和返回响应对象相同。ide

要可以与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();

2、动手

个人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());
}

测试结果

相关文章
相关标签/搜索