我目前正在循环浏览29,000个文档,在每个文档中,我将一个子文档添加到嵌套字段并进行更新。为了管理我正在处理的数据量,我将循环分成10,000个组并使用ES大小和选项来控制每次迭代应该从哪里开始。因此,一旦第一个10,000更新,我会再次查询以获取下一个10,000等等...问题是每次我到达第二组时,批处理中的一些文档已经在首先是10,000,当我到达第三批时,它应该是从20,000到29,000范围内获取文档时已经处理的所有文档。
似乎我处于某种竞争状态,因为根据版本号进行排序或查询无法实现。我也试过在查询之间刷新和刷新,但仍然没有运气。
有没有人有类似的问题?
答案 0 :(得分:2)
在ElasticSearch中,在写入内容和可用于读取内容之间存在长达1秒的延迟。你可以轻松创建一个测试来验证这一点,插入id为1的记录,立即尝试读取id 1,你将得到null。
你想要做的是使用" SCROLL SCAN
"在ES。使用滚动时,它会记录它已经给你回复的记录,这样当你请求退回下一个10,000时,你就不会得到任何重复。
注意:指定滚动扫描的大小时,指定的大小为每个分片。因此,如果您想要返回10,000个块,则需要指定size = 10,000/# number of shards