有人可以解释Elasticsearch的IndexRequestUpdateRequest之间的区别吗? UpdateRequest(类级别)的javadoc为空,我找不到任何文档。

我发现了一些将IndexRequest包裹在UpdateRequest中的代码,然后再将其添加到批量操作中,但是我发现BulkRequestBuilder不需要UpdateRequest并可以直接接受IndexRequest,这一种或另一种方式有什么好处吗?

IndexRequest indexRequest = new IndexRequest(indexName, typeName, docId)
    .source(doc);
UpdateRequest updateRequest = new UpdateRequest(indexName, typeName, docId)
    .doc(doc)
    .upsert(indexRequest);

我还观察到可以在IndexRequest上设置文档时间戳,但不能在UpdateRequest上设置文档时间戳。如果IndexRequest包装在UpdateRequest中,并且该文档是新文档,则时间戳将被写入Elasticsearch,但是如果该文档已经存在,则时间戳将被忽略并将其设置为当前时间。是否有任何文档描述这种行为?

最佳答案

IndexRequest定义了要添加到ElasticSearch中的文档,而不是实际上将执行添加到ElasticSearch中的UpdateRequest

注意:UpdateRequest.upsert()期望即使文档不存在也要使用单独的IndexRequest。这使您可以在文档已经存在的情况下使用部分文档。

10-01 06:33