2017-07-10 167 views
3

使用Elasticsearch本機Java客戶端API(TransportClient)的應用程序的升級途徑轉變爲使用Java的高級REST客戶端? (?初步)Elasticsearch從傳輸客戶端升級到高級別REST客戶端的路徑

文件似乎表明:

Java的高級REST客戶端依賴於Elasticsearch核心 項目。它接受與TransportClient 相同的請求參數,並返回相同的響應對象。

(來源:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/5.x/java-rest-high.html

但我並不完全清楚這意味着什麼。我能否將我的整個代碼庫切換到高級別REST客戶端而不重寫我的查詢或其他客戶端類型的操作?它似乎不像REST客戶端實現Client接口。這從解耦的觀點來看可能是有意義的。「

我需要知道的是我是否應該圍繞客戶端操作構建自己的抽象,或者HighLevelRestClient基本上是否已經實現了Client接口。

我是否應該繼續暫時編寫針對TransportClient API的代碼,或者當不推薦使用TransportClient時,這些代碼都需要重寫?

請注意,我正在查看高級別REST客戶端,而不是低級別REST客戶端。

+0

我在回答時遇到的一個問題是:如果客戶端對象沒有實現現有的'Client'接口,爲什麼還需要自己的抽象? – javanna

+0

@javanna我有一個使用TransportClient的現有代碼庫,我也需要編寫新代碼。我想避免在整個代碼庫中進行分散的更改。如果請求/響應相同,那麼創建一個使用這些對象並傳遞給其中一個客戶端的對象可能是合理的。它似乎並不像其他客戶完整/成熟到足以使用;這是不是真的? – Mike

+0

我會花時間儘快遷移到高級別REST客戶端,而不是在兩個客戶端之上建立抽象層。我會看看你需要使用哪個API並查看新客戶端中缺少的內容,然後等待這些內容被添加。您可以爲希望看到支持的下一個API打開github問題。 – javanna

回答

3

高級別REST客戶端不實現Client接口。這個計劃在我剛纔寫的blogpost中有描述。

我們也正在編寫​​文檔,其中將包含一個頁面,其中包含有關如何從傳輸客戶端遷移的說明。

新的客戶端重用從現有的傳輸客戶端的請求和響應,但客戶對象不兼容,這意味着,例如以下:

IndexRequest indexRequest = new IndexRequest("index", "type", "id"); 
indexRequest.source("field", "value"); 
IndexResponse indexResponse = transportClient.index(indexRequest).get(); 

將成爲類似:

IndexRequest indexRequest = new IndexRequest("index", "type", "id"); 
indexRequest.source("field", "value"); 
IndexResponse indexResponse = restHighLevelClient.index(indexRequest); 

對於異步請求,調用稍有不同(請參閱方法名稱),在新客戶端中,我們使用另一種名稱以「Async」後綴結尾的方法,您可以從以下選項中進行選擇:

transportClient.index(indexRequest, new ActionListener<IndexResponse>() { 
        @Override 
        public void onResponse(IndexResponse indexResponse) { 
         // called when the operation is successfully completed 
        } 

        @Override 
        public void onFailure(Exception e) { 
         // called on failure 
        } 
       }); 

以下幾點:

restHighLevelClient.indexAsync(indexRequest, new ActionListener<IndexResponse>() { 
       @Override 
       public void onResponse(IndexResponse indexResponse) { 
        // called when the operation is successfully completed 
       } 

       @Override 
       public void onFailure(Exception e) { 
        // called on failure 
       } 
      }); 

不幸的是,Client#prepare*方法不會在高級別客戶端可用,所以是這樣的:

IndexResponse indexResponse = transportClient.prepareIndex("index", "type", "id").setSource("field", "value").get(); 

需要被遷移到上述使用ActionRequest而不是ActionRequestBuilder s。我們正在做出這樣的改變,因爲運輸客戶中的請求和建造者之間總是混淆不清,這兩種方式完全相同。新客戶將有一種提供請求的方式。

如果您想查看當前的文檔,雖然正在進行中,但它已經存在:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high.html

高級REST客戶端將取代傳輸客戶端,雖然其第一個即將發佈的版本將只支持索引,批量,獲取,刪除,更新,搜索,搜索滾動和清除滾動API。接下來會提供對缺失API的支持,我們也會照常向用戶提供捐款。

傳輸客戶端很快就會被棄用,因此我建議儘快轉移到高級REST客戶端,這不應該是一個巨大的變化,它會帶來回報,因爲我們會在超時,已經通過REST進行了改進。

相關問題