一尘不染

更新嵌套字段以获取数百万个文档

elasticsearch

我对脚本使用批量更新以更新嵌套字段,但这非常慢:

POST index/type/_bulk

{"update":{"_id":"1"}}
{"script"{"inline":"ctx._source.nestedfield.add(params.nestedfield)","params":{"nestedfield":{"field1":"1","field2":"2"}}}}
{"update":{"_id":"2"}}
{"script"{"inline":"ctx._source.nestedfield.add(params.nestedfield)","params":{"nestedfield":{"field1":"3","field2":"4"}}}}

 ... [a lot more splitted in several batches]

您知道另一种可能更快的方法吗?

为了不对每次更新重复执行脚本,似乎可以存储该脚本,但是我找不到保持“动态”参数的方法。


阅读 250

收藏
2020-06-22

共1个答案

一尘不染

与性能优化问题一样,由于有许多可能导致性能不佳的原因,因此没有唯一的答案。

在您的情况下,您正在批量update请求。当update执行,该文件实际上是被重新索引

…要更新文档就是要对其进行检索,更改,然后为整个文档重新编制索引。

因此,有必要看一下索引性能调整技巧。在您的情况下,我会考虑的头几件事是选择正确的批量大小,使用多个线程进行批量请求并增加/禁用索引刷新间隔

您可能还会考虑使用支持并行批量请求的现成客户端,例如Python elasticsearch客户端

监视ElasticSearch性能指标以了解瓶颈在哪里,以及您的性能调整是否能带来实际收益,将是理想的选择。是有关ElasticSearch性能指标的概述博客文章。

2020-06-22