我正在使用Elasticsearch批量API发送大量文档以立即索引和删除。如果一个文档有错误,则其他文档将被成功索引或删除。这会导致 flex 存储中的数据状态错误,因为在我看来,文档之间是相互关联的。我的意思是,如果一个文档的字段具有某些值,那么其他文档对该字段也应具有相同的值。我不确定如何处理批量请求中的此类错误。是否可以任何方式回滚请求?我读过类似的问题,但无法解决此类情况。还是代替回滚,只有在没有错误的情况下,才有什么方法可以发送数据?或类似的请求空运?
最佳答案
我迟到了这个问题,但将来会回答遇到类似情况的任何人。
执行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。
关于elasticsearch - 如何处理批量请求中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47769703/