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

測試結果

相關文章
相關標籤/搜索