elasticsearch重新索引api-无法重新索引大量文档

yv5phkfx  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(372)

我正在使用elasticsearch的reindex api将日志从旧集群迁移到新版本7.9.2集群。这是我正在使用的命令。

curl -X POST "new_host:9200/_reindex?pretty&refresh&wait_for_completion=true" -H 'Content-Type: application/json' -d'
{
  "source": {
    "remote": {
      "host": "old_host:9200"
    },
    "index": "*",
    "size": 10000,    
    "query": {
      "match_all": {}      
     }
  },
  "conflicts": "proceed",
  "dest": {
    "index": "logstash"
  }
}'

这只获取最后10000个文档或1个批,然后请求就完成了。但是,我需要重新索引超过一百万个文档。有没有办法让请求对所有匹配的文档运行?我们可以设置请求中的批数,还是让请求发出批,直到所有文档都被索引?
我能想到的一个选择是通过修改datetime上的查询递归地发送请求。有更好的方法吗?我能在一个请求中得到所有匹配的文件(100多万)吗?

2skhul33

2skhul331#

拆下 query 以及 size 以获取所有数据。如果只需要使用查询筛选所需的文档,只需删除 size 获取所有匹配的日志。
使用 wait_for_completion=false as query param将返回 task id 您可以使用 GET /_tasks/<task_id> .
如果您需要或想要将重新索引分解为几个步骤/块,请考虑使用切片功能。
顺便说一句:使用*一个接一个地重新编制索引,而不是一个地重新编制索引,并考虑使用每日/每月索引,因为与整个索引相比,恢复出错过程和管理日志保留变得更容易。
为了提高速度,应该将副本减少到0,并在目标索引bevore reindexing中设置refresh\u interval=-1,然后重置这些值。

curl -X POST "new_host:9200/_reindex?pretty&wait_for_completion=false" -H 'Content-Type: application/json' -d'
{
  "source": {
    "remote": {
      "host": "old_host:9200"
    },
    "index": "index_name"
  },
  "conflicts": "proceed",
  "dest": {
    "index": "logstash"
  }
}'

根据评论更新:
重新编制索引时,至少有一个错误导致重新编制索引停止。此错误是由至少一个文档(id=xib9…)在字段“fields.statuscode”中的值为“ok”引起的。但目标索引中的Map与导致上述异常的数据类型无关。
例如,解决方案是将源文档statuscode更改为200,但是可能会有更多的文档导致相同的错误。
另一种解决方案是将目标索引中的Map更改为 keyword 类型-在插入任何数据之前需要手工创建Map集,可能需要重新索引已经存在的数据。

相关问题