按查询更新在ElasticSearch中非常慢

7qhs6swi  于 2023-03-12  发布在  ElasticSearch
关注(0)|答案(1)|浏览(265)

我试图将一个对象类型的字段的数据复制到另一个嵌套类型的字段。我尝试使用无痛脚本和ElasticSearch按查询更新进行复制。但我花了大约48小时复制了840万数据。有什么方法可以加快此操作吗
这是url localhost:9200/myindex/_update_by_query?conflicts=proceed&requests_per_second=50,主体为

"query": {
        "match_all": {}
    },
    "script": {
        "inline": "ctx._source.myfield_copy = ctx._source.myfield;"
    }
}```

I want to speed up this operation
4xy9mtcn

4xy9mtcn1#

通过指定requests_per_second,可以限制操作。
由于默认的bath大小是1000,并且承认50条记录的写入时间是100ms(假设,您的里程可能会有所不同),因此我们有

target_time = 1000 / 50 per second = 20 seconds
wait_time = target_time - write_time = 20 seconds - 0.1 seconds = 19.9 seconds

所以你基本上在每一批之间等待了19.9秒,这可能就是为什么要花这么长时间的原因。只要完全删除requests_per_second,这应该已经有很大帮助了。
如果您只是将一个字段复制到另一个字段中,另一个性能改进是不使用脚本,而是使用接收管道

PUT _ingest/pipeline/copy-field
{
  "processors": [
    {
      "set": {
        "field": "myfield_copy",
        "copy_from": "myfield"
      }
    }
  ]
}

然后通过引用该管道简单地运行按查询更新:

POST myindex/_update_by_query?pipeline=copy-field&wait_for_completion=false

相关问题