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

Elasticsearch reindex API - Not able to reindex large number of documents

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

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

删除 querysize 参数以获取所有数据。如果您只需要使用查询过滤所需的文档,只需删除 size 即可获取所有匹配的日志。

使用 wait_for_completion=false 作为查询参数将 return task id 并且您将能够使用 GET /_tasks/<task_id>.

监控重建索引进度

如果您需要或想要将重建索引分解为多个 steps/chunks,请考虑使用 slice feature

顺便说一句:重新索引一个又一个索引 instead all at one using * 并考虑使用 daily/monthly 索引,因为与整个索引相比,它更容易恢复错误过程并管理日志保留。

为了提高速度,您应该在重建索引之前将副本数减少到 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 类型 - 这需要在插入任何数据之前手动设置映射,并可能重新索引已经存在的数据。