【问题标题】:How to handle errors with bulk requests如何处理批量请求的错误
【发布时间】:2018-05-25 23:11:33
【问题描述】:
我正在使用 Elasticsearch 批量 API 一次发送大量文档以进行索引和删除。如果一个文档有错误,其他文档将被成功索引或删除。这会导致弹性存储中的数据状态错误,因为在我的案例中,文档是相互关联的。我的意思是,如果一个文档的字段具有某些值,那么还有其他文档也应该对该字段具有相同的值。我不确定如何处理来自批量请求的此类错误。是否可以以任何方式回滚请求?我阅读了类似的问题,但无法获得处理此类案件的解决方案。或者不是回滚,有没有什么办法只有在没有错误的情况下才发送数据?或类似请求的空运行?
【问题讨论】:
标签:
elasticsearch
error-handling
elasticsearch-bulk-api
【解决方案1】:
我迟到了这个问题,但会为将来遇到类似情况的人回答。
在执行 Elasticsearch (ES) 批量 API 又名 BulkRequest 后,您会得到一个 BulkResponse 作为回报,其中包含一个或多个 BulkItemResponse。 BulkItemResponse 有一个方法 isFailed() 会告诉你该操作是否失败。在您的情况下,如果有失败,您可以遍历响应中的所有项目并根据您的要求处理失败的响应。
Synchronous 执行的代码如下所示:
val bulkResponse: BulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
bulkResponse.iterator.asScala
.filter(_.isFailed)
.foreach(item => { // your logic to handle failures })
对于Asynchronous 执行,您可以提供一个listener,它将在执行完成后调用。在这种情况下,您必须覆盖 onResponse() 和 onFailure()。你可以在https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-document-bulk.html了解更多信息
HTH。