Get API
Get請求
GetRequest
需要以下參數:
GetRequest getRequest = new GetRequest(
"posts",
"doc",
"1");
-
posts
— 索引。 -
doc
— 類型。 -
1
— 文檔id。
可選參數
可以選擇提供以下參數:
request.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);
- 禁用源檢索,默認情況下啓用
String[] includes = new String[]{"message", "*Date"};
String[] excludes = Strings.EMPTY_ARRAY;
FetchSourceContext fetchSourceContext =
new FetchSourceContext(true, includes, excludes);
request.fetchSourceContext(fetchSourceContext);
- 爲特定字段配置源包含
String[] includes = Strings.EMPTY_ARRAY;
String[] excludes = new String[]{"message"};
FetchSourceContext fetchSourceContext =
new FetchSourceContext(true, includes, excludes);
request.fetchSourceContext(fetchSourceContext);
- 爲特定字段配置源排除
request.storedFields("message");
GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
String message = getResponse.getField("message").getValue();
- 配置特定存儲字段的檢索(要求字段分別存儲在映射中)。
- 檢索
message
存儲字段(要求字段分別存儲在映射中)。
request.routing("routing");
- 路由值。
request.parent("parent");
- parent值。
request.preference("preference");
- 偏好值。
request.realtime(false);
- 將
realtime
標誌設置爲false
(默認爲true
)。
request.refresh(true);
- 在檢索文檔之前執行刷新(默認爲
false
)。
request.version(2);
- 版本。
request.versionType(VersionType.EXTERNAL);
- 版本類型。
同步執行
以下列方式執行GetRequest
時,客戶端在繼續執行代碼之前等待返回GetResponse
:
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
異步執行
執行GetRequest
也可以以異步方式完成,以便客戶端可以直接返回,用戶需要通過將請求和偵聽器傳遞給異步get
方法來指定響應或潛在故障的處理方式:
client.getAsync(request, RequestOptions.DEFAULT, listener);
- 要執行的
GetRequest
和執行完成時要使用的ActionListener
。
異步方法不會阻塞並立即返回,完成後,如果執行成功完成,則使用onResponse
方法回調ActionListener
,如果失敗則使用onFailure
方法。
get
的典型監聽器看起來像:
ActionListener<GetResponse> listener = new ActionListener<GetResponse>() {
@Override
public void onResponse(GetResponse getResponse) {
}
@Override
public void onFailure(Exception e) {
}
};
-
onResponse
— 執行成功完成時調用。 -
onFailure
— 在整個GetRequest失敗時調用。
Get響應
返回的GetResponse
允許檢索所請求的文檔及其元數據和最終存儲的字段。
String index = getResponse.getIndex();
String type = getResponse.getType();
String id = getResponse.getId();
if (getResponse.isExists()) {
long version = getResponse.getVersion();
String sourceAsString = getResponse.getSourceAsString();
Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
byte[] sourceAsBytes = getResponse.getSourceAsBytes();
} else {
}
- 以字符串形式檢索文檔。
- 將文檔檢索爲
Map<String, Object>
。 - 以
byte[]
的形式檢索文檔。 - 處理未找到文檔的方案,請注意,雖然返回的響應具有
404
狀態代碼,但返回有效的GetResponse
而不是拋出異常,此類響應不包含任何源文檔,並且其isExists
方法返回false
。
當針對不存在的索引執行get
請求時,響應具有404
狀態代碼,拋出ElasticsearchException
,需要按如下方式處理:
GetRequest request = new GetRequest("does_not_exist", "doc", "1");
try {
GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException e) {
if (e.status() == RestStatus.NOT_FOUND) {
}
}
- 處理拋出的異常,因爲索引不存在。
如果已請求特定文檔版本,並且現有文檔具有不同的版本號,則會引發版本衝突:
try {
GetRequest request = new GetRequest("posts", "doc", "1").version(2);
GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.CONFLICT) {
}
}
- 引發的異常表示返回了版本衝突錯誤。