我查过官方文件和文件:
批量api的响应包含请求中每个操作的单独结果,并按提交的顺序返回。单个操作的成功或失败不影响请求中的其他操作。
如果文档具有相同的主键'\u id',则官方文档不会告诉文档是否按顺序写入elasticsearch。
这里有一个例子。我有3个相同pk id=1的文档,其他字段不同。我为这3个文档创建了3个updaterequest。我将这些文件添加到批量订单请求中。提交给es客户端后,我是否可以确保这些文档按照我添加到批量请求的顺序在es中执行?
// Three docs with same id but different non-pk field value
Map<String,String> doc1 = new HashMap;
doc1.put("_id","1");
doc1.put("other_column","columnValue1");
Map<String,String> doc2 = new HashMap;
doc1.put("_id","1");
doc1.put("other_column","columnValue2");
Map<String,String> doc3 = new HashMap;
doc1.put("_id","1");
doc1.put("other_column","columnValue3");
//prepare 3 update Request
UpdateRequest updateRequest1 = new UpdateRequest(index,type,"1").docAsUpsert(true).setDoc(doc1);
UpdateRequest updateRequest2 = new UpdateRequest(index,type,"1").docAsUpsert(true).setDoc(doc2);
UpdateRequest updateRequest3 = new UpdateRequest(index,type,"1").docAsUpsert(true).setDoc(doc3);
//add the to bulk request
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(indexRequest1);
bulkRequest.add(indexRequest2);
bulkRequest.add(indexRequest3);
//execute by client
restHighLevelClient.bulk(bulkRequest);
//if doc2 write into elasticsearch failed, doc1 and doc2 may also be executed successfully as the official doc said. Is it right?
但是,doc说单个操作的成功或失败并不影响请求中的其他操作。在我的例子中,如果es请求中具有相同主键的文档有部分失败文档,而其他文档成功写入es。显然,这意味着它们不是按顺序写入es的。es客户端批量api不能保证文档按顺序写入es的结论是正确的吗?
1条答案
按热度按时间qc6wkl3g1#
如果只使用大容量处理器插入记录,则在刷新过程中,根据时间戳按顺序刷新记录。因此,文档将使用特定文档id的最新数据进行更新。假设您为文档编制索引,然后将其删除。因此最终结果将是文档被删除。
但是,如果有正常的索引正在进行而不是批量,并且如果使用批量和常规索引api对同一id进行索引,则不会维护顺序。因为冲洗可能发生在不同的时间。假设您使用bulk为id为1的文档编制索引,然后使用常规索引api删除id为1的文档。如果将批量刷新间隔设置为5秒,则删除的索引可能会保留在es中。