get 接口

本文详细介绍了Elasticsearch的GetRequest及其可选参数,包括禁用source检索、配置source包含与排除、检索存储字段、路由值、偏好度、实时标志、刷新、版本控制和异步执行。GetResponse则提供了获取文档元数据、存储字段及处理不存在文档或版本冲突的方法。同步与异步执行各有优缺点,适用于不同场景。
摘要由CSDN通过智能技术生成


官方文档地址: 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

在服务器返回4xx5xx错误代码的情况下,高级客户端尝试解析响应体错误细节,然后抛出一个通用的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) {
        //所引发的异常表明返回了版本冲突错误
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值