【问题标题】:Elasticsearch reindex api -not able to copy all the documentsElasticsearch reindex api - 无法复制所有文档
【发布时间】:2020-03-13 02:15:26
【问题描述】:

在运行_reindex 操作之前,我已经设置了目标索引new_dest_index,包括设置映射、分片计数、副本等。

我运行了下面的 POST 命令将所有文档从 source_index 复制到 new_dest_index,但它看起来像是在后台运行并且只复制了一些文档,而不是来自 source_index 的所有数据。

有人可以帮忙吗?如果有更好的方法可以从一个索引复制到另一个索引?

POST _reindex
{
  "source": {
    "index": "source_index"
  },
  "dest": {
    "index": "new_dest_index"
  }
}

【问题讨论】:

  • 您能否提供更多信息,例如提供您在运行此程序时收到的响应?另外两者在映射上有什么区别?

标签: elasticsearch elasticsearch-dsl


【解决方案1】:

我认为这是从一个索引复制到另一个索引的最佳方式。

reindex 进程,如果我没记错的话,每次从一个索引复制大量 10,000 到另一个索引。您没有看到目标索引中的所有文档,因为任务尚未完成(在最好的情况下)。

您始终可以使用_cat/tasks 列出reindex 任务,例如:

GET _cat/tasks?v

如果您在输出中看到 reindex 任务,则它还没有完成,您必须再等一会儿。这些过程需要几分钟甚至几小时,具体取决于要复制的文档数量。

但是,如果您没有看到它列出并且一个索引中的文档与另一个索引中的复制文档数不匹配,则reindex 进程失败并且必须再次运行。

当您想不受限制地复制所有文档时,最后一种情况很糟糕。

避免这种情况的方法是reindex with Queries。例如,您可以为 1 月至 3 月的所有文档运行 reindex 任务,为 4 月至 6 月的文档运行另一个任务,依此类推。

您可以运行多个reindex 任务而不会重叠。请注意这一点,因为任务过多可能会影响集群的性能或运行状况。

希望这有帮助! :)

【讨论】:

  • 感谢您的建议!!真的很感激。会试试看!!
【解决方案2】:

Kevin已经展示了reindex任务尚未完成的情况,我在reindex过程完成后回答。

请注意,_reindex API 可能会导致数据不一致的问题,即 source_index 上的新更新(新插入 + 更新)发生在触发 _reindex 之后,不适用于 new_dest_index

例如,在运行_reindex 之前,添加一个文档:

PUT source_index/doc/3
{
  "id": 3,
  "searchable_name": "version1"
}
//responses
{
  "_index": "source_index",
  "_type": "doc",
  "_id": "3",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
  },
  "created": true
}

然后你触发_reindex API,在触发_reindex之后,你更新你的文档:

PUT source_index/doc/3
{
  "id": 3,
  "searchable_name": "version2"
}
//responses
{
  "_index": "source_index",
  "_type": "doc",
  "_id": "3",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
  },
  "created": false
}

但是在_reindex 完成后,您检查new_dest_index 中文档的版本:

{
  "_index": "new_dest_index",
  "_type": "doc",
  "_id": "3",
  "_version": 1,
  "found": true,
  "_source": {
    "id": 3,
    "searchable_name": "version1"
  }
}

在触发器_reindex 之后插入的文档也会出现同样的问题 一种解决方案是,第一次使用version_type= external 设置为new_dest_index 重新索引并保留source_index 的版本时,在将写入传输到new_dest_index 后,您可以再次从source_index 重新索引到@987654337 @ 在触发_reindex 后重新索引丢失的新更新。 您可以在docs here 中查看这些设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 2018-06-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多