目前,我必须在elasticsearch中索引的超过100万个文档中更新一个字段。这是一项复杂的任务,因为该字段包含从XML文件生成的元数据,计算xpath表达式。我们必须遍历索引中的所有文档并更新这个字段。因此,为了避免过度使用系统,我们决定使用ironworker平台。我读过几篇关于如何在elasticsearch中更新数百万个文档的文章,就像这篇一样,但是考虑到我们要使用ironworker,有一些限制,比如一个任务只能运行60分钟。
问题:考虑到60分钟的限制,我如何遍历所有文档并更新其字段。
我认为打开并滚动并将scroll_id传递给下一个worker,但我不知道执行下一个任务需要多长时间,因此滚动可能会过期,我将不得不从头开始。
从您的描述中听起来您可以将IronWorker任务链接在一起,这实际上非常容易。如果你知道更新一个项目需要多长时间,那么你就可以推断出你需要多长时间。假设更新一个条目需要100毫秒,那么你可以每秒更新10毫秒,或者每分钟更新600毫秒,所以可能会更新6000毫秒(这需要大约10分钟),然后将代码中的下一个条目排队。排队等待下一个任务就像排队等待第一个任务一样简单:http://dev.iron.io/worker/reference/api/#queue_a_task(也可以使用您的语言的客户端库)。
或者在X分钟后停止并排队等待下一个工人。
或者如果你想让事情变得更快,何不同时排成26个队列,每个字母一个?每个人都可以查询所有以分配给它的字母开头的项目(前缀查询)。