官方文档地址: Get API
GetRequest
一个GetRequest
要求下列参数:
GetRequest getRequest = new GetRequest(
"posts", //索引
"1");//文档ID
可选参数
可以提供以下参数:
//禁用source检索,默认启用
getRequest.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);
String[] includes = new String[]{"message", "*Date"};
String[] excludes = Strings.EMPTY_ARRAY;
FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
//为特定字段配置source包含
getRequest.fetchSourceContext(fetchSourceContext);
String[] includes = Strings.EMPTY_ARRAY;
String[] excludes = new String[]{"message"};
FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
//为特定字段配置source排除
getRequest.fetchSourceContext(fetchSourceContext);
//配置特定存储字段的检索(要求字段在映射中单独存储)
getRequest.storedFields("message");
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
//检索存储的message字段(要求字段在映射中单独存储)
String message = getResponse.getField("message").getValue();
//路由值
getRequest.routing("routing");
//喜好度
getRequest.preference("preference");
//设置realtime标志为false(默认为true)
getRequest.realtime(false);
//在检索文档之前执行刷新(默认为false)。
getRequest.refresh(true);
//版本号
getRequest.version(2);
//版本类型
getRequest.versionType(VersionType.EXTERNAL);
同步执行
当以以下方式执行GetRequest
时,客户端会等待GetResponse
返回,然后才会继续执行代码:
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
同步调用可能会在无法解析高级 REST 客户端中的 REST 响应、请求超时或没有从服务器返回响应等类似情况下会抛出IOException
。
在服务器返回4xx
或5xx
错误代码的情况下,高级客户端尝试解析响应体错误细节,然后抛出一个通用的ElasticsearchException
,并将原始的ResponseException
作为被抑制的异常添加到其中。
异步执行
还可以以异步方式执行GetRequest
,以便客户端可以直接返回。用户需要通过将请求和侦听器传递给异步 get 方法来指定如何处理响应或潜在的失败:
//要执行的GetRequest和执行完成时要使用的ActionListener
client.getAsync(getRequest, RequestOptions.DEFAULT, listener);
异步方法不会阻塞并会立即返回。如果执行成功,则使用onResponse
方法回调ActionListener
;如果执行失败,则使用onFailure
方法回调ActionListener
。失败场景和预期异常与同步执行情况相同。
get
的标准侦听器如下所示:
ActionListener<GetResponse> listener = new ActionListener<GetResponse>() {
@Override
public void onResponse(GetResponse getResponse) {
//当执行成功完成时调用。
}
@Override
public void onFailure(Exception e) {
//当整个GetRequest失败时调用。
}
};
GetResponse
返回的GetResponse
允许检索请求的文档及其元数据和最终存储的字段。
String index = getResponse.getIndex();
String id = getResponse.getId();
if (getResponse.isExists()) {
long version = getResponse.getVersion();
//以String形式检索文档
String sourceAsString = getResponse.getSourceAsString();
//以Map<String, Object>的形式检索文档
Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
//以byte[]的形式检索文档
byte[] sourceAsBytes = getResponse.getSourceAsBytes();
} else {
//处理没有找到文档的场景。
//注意,尽管返回的响应有404状态代码,但返回的是一个有效的GetResponse,而不是抛出异常。
//这样的响应不包含任何源文档,它的isExists方法返回false。
}
当一个 get 请求对一个不存在的索引执行时,响应有404
状态代码,一个ElasticsearchException
被抛出,需要如下处理:
GetRequest getRequest = new GetRequest("does_not_exist", "1");
try {
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
} catch (ElasticsearchException e) {
if (e.status() == RestStatus.NOT_FOUND) {
//处理由于索引不存在而引发的异常
}
}
如果请求的是特定的文档版本,而现有的文档有不同的版本号,则会引发版本冲突:
try {
GetRequest getRequest = new GetRequest("posts", "1").version(2);
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.CONFLICT) {
//所引发的异常表明返回了版本冲突错误
}
}