问题描述
我正在使用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批,之后请求完成。但是,我需要重新索引超过一百万个文档。有没有办法让所有匹配的文档都运行请求?我们可以设置请求中的批处理数量还是让请求发出批处理,直到所有文档都被索引?
我可以想到的一个选择是通过修改日期时间的查询来递归发送请求。有更好的方法吗?我可以在一个请求中获得所有匹配的文档(超过一百万)吗?
解决方法
删除query
和size
参数以获取所有数据。如果您只需要使用查询过滤所需的文档,只需删除size
即可获取所有匹配的日志。
使用wait_for_completion=false
作为查询参数将返回task id
,您将能够使用GET /_tasks/<task_id>
来监视重新索引的进度。
如果您需要或希望将重新编制索引分为多个服务器步骤/块,请考虑使用slice feature。
BTW:将索引重新索引一次instead all at one using *,并考虑使用每日/每月索引,因为与一个完整索引相比,它更容易恢复错误过程并管理日志保留。
为了提高速度,应该将副本减少为0,并在重新建立索引之前在目标索引中设置refresh_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”引起的。但是目标索引中的映射与导致上述异常的数据类型一样长。
解决方案是例如将源文档的StatusCode更改为200,但是可能会有更多的文档引起同样的错误。
另一种解决方案是将目标索引中的映射更改为keyword
类型-在插入任何数据之前可能需要手工映射,并可能重新索引已经存在的数据。