Elasticsearch重新索引API-无法重新索引大量文档

问题描述

我正在使用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批,之后请求完成。但是,我需要重新索引超过一百万个文档。有没有办法让所有匹配的文档都运行请求?我们可以设置请求中的批处理数量还是让请求发出批处理,直到所有文档都被索引?

我可以想到的一个选择是通过修改日期时间的查询来递归发送请求。有更好的方法吗?我可以在一个请求中获得所有匹配的文档(超过一百万)吗?

解决方法

删除querysize参数以获取所有数据。如果您只需要使用查询过滤所需的文档,只需删除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类型-在插入任何数据之前可能需要手工映射,并可能重新索引已经存在的数据。