如何从BulkItemResponse到相应的Request

时间:2017-01-07 15:55:08

标签: elasticsearch bulk

我在Java中使用Elasticsearch's bulk requests,我试图处理发生错误的情况:

BulkResponse bulkResponse = bulkRequest.get();
if (bulkResponse.hasFailures()) {
    for (BulkItemResponse response : bulkResponse) {
        if (response.isFailed()
        || response.getResponse().getShardInfo().getFailed() > 0) {
            //Find the corresponding request and resend it
        }
    }
}

在找到有错误的回复后,我想重新发送请求,因为在我的情况下错误可能是暂时的,在大多数情况下,重试可以解决问题。

所以我的问题是,如何从BulkItemResponse转到导致它的原始Request?有没有比依赖请求和响应顺序更好的方法?

1 个答案:

答案 0 :(得分:0)

不,你没有那个AFAIK。您需要以某种方式将所有添加的元素保留为批量,如果出现错误,请使用来自response.getId()的ID将其与原始数据相关联。

类似于:

HashMap<String, Object> myData = new HashMap<>();

BulkRequestBuilder brb = BulkAction.INSTANCE.newRequestBuilder(client);

myData.put(myObject.getId(), myObject);
brb.add(new IndexRequest("index", "type", myObject.getId()).source(myObject.toJson()));

// Other actions
BulkResponse response = client.bulk(brb.request()).get();
response.forEach(bulkItemResponse -> {
    if (bulkItemResponse.isFailed()) {
        Object objectToSendAgain = myData.get(bulkItemResponse.getId());
        // Do what is needed with this object
    }
});

myData = null;

我希望这会有所帮助。