【问题标题】:Updating field of million of document from a worker从工作人员更新百万文档的字段
【发布时间】:2026-01-07 20:10:01
【问题描述】:

目前我必须更新在 elasticsearch 中索引的超过 100 万个文档中的一个字段。这是一项复杂的任务,因为该字段包含从 XML 文件生成的元数据,用于评估 xpath 表达式。我们必须遍历索引中的所有文档并更新该字段。因此,为了避免系统过度杀伤,我们决定使用 Ironworker 平台。
我已经阅读了几篇关于如何在 elasticsearch 中更新数百万个文档的帖子,例如 this one,但是鉴于我们要使用 Ironworkers,因此存在一些限制,例如一个任务只能运行 60 分钟。

问题: 考虑到 60 分钟的限制,我如何遍历所有文档并更新其字段。
我想打开并滚动并将 scroll_id 传递给下一个工作人员,但我不知道执行下一个任务需要多长时间,所以滚动可能会过期,我将不得不重新开始。

【问题讨论】:

  • 1 Mio 文档可以在很短的时间内更新,但这取决于很多事情。仅施加 60 分钟的限制是因为您决定使用 Ironworker,但我相信还有其他替代方案不会过度破坏您的系统。不幸的是,我们对您的要求知之甚少。什么涉及检索 XML 元数据的“复杂任务”?您能否展示该 XML 元数据的示例?示例文档?
  • @Val,就是这样,这个任务可以像客户决定的那样复杂。元数据分析从用户上传的附件和他定义的 xpath 表达式列表开始。因此,我们需要为任何程度的复杂性做好准备。如果我能找到将一个铁匠与另一个铁匠联系起来的方法,并在一段已知的时间后进行第二次启动,那将是一个好的开始。这样我就可以为下一个工人保持滚动。

标签: elasticsearch nest ironworker


【解决方案1】:

根据您的描述,您可以将 IronWorker 任务链接在一起,这实际上非常简单。如果您对更新单个项目需要多长时间有所了解,那么您可以推断出您需要多长时间。假设更新一个项目需要 100 毫秒,那么您可以每秒执行 10 次,或每分钟 600 次,所以可能执行 6000 次(大约需要 10 分钟),然后从您的代码中排队下一个。排队下一个任务就像排队第一个任务一样简单:http://dev.iron.io/worker/reference/api/#queue_a_task(也可以使用您的语言的客户端库)。

或者在 X 分钟后停止并排队下一个工人。

或者,如果您想让事情变得更快,那么同时排队 26 个如何,每个字母对应一个?每个人都可以查询以分配给 (Prefix Query) 的字母开头的所有项目。

有很多方法可以解决这个问题。

【讨论】:

  • 感谢 Travis,还有一个问题,我需要为下一个任务保持打开滚动足够的时间,所以,如果我毫不拖延地安排下一个任务,铁工平台可以确保这一点或这取决于安排了多少其他任务?
  • 下一个作业应该在几秒钟内开始。