官方文档地址: Delete API
DeleteRequest
DeleteRequest
有两个必需参数:
DeleteRequest deleteRequest = new DeleteRequest(
"posts", //索引
"1");//文档ID
可选参数
可以提供以下参数:
//路由值
deleteRequest.routing("routing");
使用TimeValue作为等待主分片可用的超时时间
deleteRequest.timeout(TimeValue.timeValueMinutes(2));
//使用String作为等待主分片可用的超时时间
deleteRequest.timeout("2m");
//WriteRequest.RefreshPolicy作为刷新策略
deleteRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);
//使用String作为刷新策略
deleteRequest.setRefreshPolicy("wait_for");
//版本
deleteRequest.version(2);
//版本类型
deleteRequest.versionType(VersionType.EXTERNAL);
同步执行
当以以下方式执行DeleteRequest
时,客户端会等待DeleteRequest
返回,然后才会继续执行代码:
DeleteResponse deleteResponse = client.delete(
deleteRequest, RequestOptions.DEFAULT);
同步调用可能会在无法解析高级 REST 客户端中的 REST 响应、请求超时或没有从服务器返回响应等类似情况下会抛出IOException
。
在服务器返回4xx
或5xx
错误代码的情况下,高级客户端尝试解析响应体错误细节,然后抛出一个通用的ElasticsearchException
,并将原始的ResponseException
作为被抑制的异常添加到其中。
异步执行
还可以以异步方式执行DeleteRequest
,以便客户端可以直接返回。用户需要通过将请求和侦听器传递给异步 delete 方法来指定如何处理响应或潜在的失败:
//要执行的IndexRequest和执行完成时要使用的ActionListener
client.deleteAsync(deleteRequest, RequestOptions.DEFAULT, listener);
异步方法不会阻塞并会立即返回。如果执行成功,则使用onResponse
方法回调ActionListener
;如果执行失败,则使用onFailure
方法回调ActionListener
。失败场景和预期异常与同步执行情况相同。
delete
的标准侦听器如下所示:
listener = new ActionListener<DeleteResponse>() {
@Override
public void onResponse(DeleteResponse deleteResponse) {
//当执行成功完成时调用。
}
@Override
public void onFailure(Exception e) {
//当整个DeleteRequest失败时调用。
}
};
DeleteResponse
返回的DeleteResponse
允许检索关于执行操作的信息,如下所示:
String index = deleteResponse.getIndex();
String id = deleteResponse.getId();
long version = deleteResponse.getVersion();
ReplicationResponse.ShardInfo shardInfo = deleteResponse.getShardInfo();
if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
//处理成功分片的数量小于总分片的情况
}
if (shardInfo.getFailed() > 0) {
for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures()) {
//处理可能的失败
String reason = failure.reason();
}
}
也可以检查是否找到该文件:
DeleteRequest deleteRequest = new DeleteRequest("posts", "does_not_exist");
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
if (deleteResponse.getResult() == DocWriteResponse.Result.NOT_FOUND) {
//如果找不到要删除的文档,在这里进行处理
}
如果有版本冲突,将抛出一个ElasticsearchException
:
try {
DeleteResponse deleteResponse = client.delete(
new DeleteRequest("posts", "1").setIfSeqNo(100).setIfPrimaryTerm(2),
RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) {
if (exception.status() == RestStatus.CONFLICT) {
//所引发的异常表明返回了版本冲突错误
}
}