1

我正在使用 Elasticsearch 批量 API 一次将大量文档发送到索引和删除。如果一个文档有错误,其他文档将被成功索引或删除。这会导致弹性存储中的数据状态错误,因为在我的案例中,文档是相互关联的。我的意思是,如果一个文档的字段具有某些值,那么还有其他文档也应该对该字段具有相同的值。我不确定如何处理来自批量请求的此类错误。是否可以以任何方式回滚请求?我阅读了类似的问题,但无法获得处理此类案件的解决方案。或者不是回滚,有没有什么办法只有在没有错误的情况下才发送数据?或类似请求的空运行?

4

1 回答 1

0

我迟到了这个问题,但会为将来遇到类似情况的人回答。

在执行 Elasticsearch (ES) 批量 API akaBulkRequest之后,您会得到一个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。

于 2019-11-06T23:47:39.017 回答