我正在使用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多万)吗?
1条答案
按热度按时间2skhul331#
拆下
query
以及size
以获取所有数据。如果只需要使用查询筛选所需的文档,只需删除size
获取所有匹配的日志。使用
wait_for_completion=false
as query param将返回task id
您可以使用GET /_tasks/<task_id>
.如果您需要或想要将重新索引分解为几个步骤/块,请考虑使用切片功能。
顺便说一句:使用*一个接一个地重新编制索引,而不是一个地重新编制索引,并考虑使用每日/每月索引,因为与整个索引相比,恢复出错过程和管理日志保留变得更容易。
为了提高速度,应该将副本减少到0,并在目标索引bevore reindexing中设置refresh\u interval=-1,然后重置这些值。
根据评论更新:
重新编制索引时,至少有一个错误导致重新编制索引停止。此错误是由至少一个文档(id=xib9…)在字段“fields.statuscode”中的值为“ok”引起的。但目标索引中的Map与导致上述异常的数据类型无关。
例如,解决方案是将源文档statuscode更改为200,但是可能会有更多的文档导致相同的错误。
另一种解决方案是将目标索引中的Map更改为
keyword
类型-在插入任何数据之前需要手工创建Map集,可能需要重新索引已经存在的数据。