高級別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進行了改進。
我在回答時遇到的一個問題是:如果客戶端對象沒有實現現有的'Client'接口,爲什麼還需要自己的抽象? – javanna
@javanna我有一個使用TransportClient的現有代碼庫,我也需要編寫新代碼。我想避免在整個代碼庫中進行分散的更改。如果請求/響應相同,那麼創建一個使用這些對象並傳遞給其中一個客戶端的對象可能是合理的。它似乎並不像其他客戶完整/成熟到足以使用;這是不是真的? – Mike
我會花時間儘快遷移到高級別REST客戶端,而不是在兩個客戶端之上建立抽象層。我會看看你需要使用哪個API並查看新客戶端中缺少的內容,然後等待這些內容被添加。您可以爲希望看到支持的下一個API打開github問題。 – javanna