开发学院

您的位置:首页>教程>正文

教程正文

ElasticSearch 7 JAVA实例:获取文档

GetRequest

  要获取一个文档,需要使用GetRequest对象,GetRequest的调用如下:

GetRequest getRequest = new GetRequest(
        "posts", //索引名称
        "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(); //检索消息存储字段(要求该字段单独存储在映射中)

request.routing("routing"); //路由值

request.preference("preference"); //偏好值

request.realtime(false); //将realtime标志设置为false

request.refresh(true); //在检索文档之前执行刷新(默认为false)

request.version(2); //版本

request.versionType(VersionType.EXTERNAL); //版本类型

同步执行

  当以下列方式执行GetRequest时,客户端会在继续执行代码之前等待GetResponse返回:

GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);

  同步调用可能会在高级REST客户端中解析REST响应失败、请求超时或类似服务器没有响应的情况下抛出IOException。

  在服务器返回4xx或5xx错误代码的情况下,高级客户端会尝试解析响应主体错误详细信息,然后抛出一个通用的ElasticsearchException,并将原始ResponseException作为抑制异常添加到其中。

异步执行

  执行GetRequest也可以异步方式完成,这样客户端就可以直接返回。用户需要通过向异步get方法传递请求和侦听器来指定如何处理响应或潜在故障:

client.getAsync(request, RequestOptions.DEFAULT, listener); //要执行的GetRequest和执行完成时要使用的ActionListener

  异步方法不会阻塞并立即返回。如果执行成功,则使用onResponse方法回调操作侦听器,如果执行失败,则使用onFailure方法回调操作侦听器。失败场景和预期异常与同步执行情况相同。

  一个典型的listener如下:

ActionListener<GetResponse> listener = new ActionListener<GetResponse>() {
    @Override
    public void onResponse(GetResponse getResponse) {//执行成功的时候调用
        
    }
    @Override
    public void onFailure(Exception e) {//出错的时候调用
        
    }
}

GetResponse对象

  返回的GetResponse允许检索请求的文档及其元数据和最终存储的字段。

String index = getResponse.getIndex();
String id = getResponse.getId();
if (getResponse.isExists()) {
    long version = getResponse.getVersion();
    String sourceAsString = getResponse.getSourceAsString(); //以字符串形式检索文档  
    Map<String, Object> sourceAsMap = getResponse.getSourceAsMap(); //以Map<String, Object>的形式检索文档
    byte[] sourceAsBytes = getResponse.getSourceAsBytes(); //以byte[]形式检索文档   
} else {
    
}

  处理找不到文档的情况。请注意,虽然返回的响应有404个状态代码,但返回的是有效的GetResponse,而不是引发的异常。这种响应不包含任何源文档,其isExists方法返回false。

  当对不存在的索引执行get请求时,响应具有404状态代码,会引发一个ElasticsearchException,需要按如下方式处理:

GetRequest request = new GetRequest("does_not_exist", "1");
try {
    GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException e) {
    if (e.status() == RestStatus.NOT_FOUND) {
        //处理因索引不存在而引发的异常
    }
}

  如果请求了特定的文档版本,并且现有文档具有不同的版本号,则会引发版本冲突: 

try {
    GetRequest request = new GetRequest("posts", "1").version(2);
    GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) {
    if (exception.status() == RestStatus.CONFLICT) {
        //引发的异常表明返回了版本冲突错误
    }
}