首页 > 解决方案 > 如何在没有过时读取的情况下重新索引 Elasticsearch?

问题描述

我有大量读/写操作的索引。我的索引有一个读别名和一个写别名。当我需要更新索引中的映射时,我会执行以下过程:

  1. 使用新映射创建新索引,

  2. 将写别名添加到新索引。

  3. 删除旧索引的写别名。

  4. 像这样重新索引数据

    POST _reindex?wait_for_completion=false
    {
    "conflicts": "proceed",
    
    "source": {
    "index": "old-index"
    },
     "dest": {
       "op_type": "create", 
       "index": "new-index"
     }
    }
    
  5. 重新索引读取别名指向旧索引,而写入别名指向新索引

  6. 重新索引完成后,我在新索引上创建读取别名并删除旧索引上的读取别名。

此过程运行良好,但有一个警告。虽然重新索引数据对于读取的应用程序来说是陈旧的,即在我将读取切换到新索引之前无法读取更新。

由于我有相当大的索引,重新索引需要很多小时。

有没有办法在不读取过时数据的情况下处理重新索引?

我当然想在重新索引时同时写入两个索引,但据我所知,这是不可能的。

我能想到的唯一解决方法是在客户端进行编辑,因此在重新编制索引期间,所有写入都在两个单独的请求中进入两个索引。

非常感谢任何想法或意见

标签: elasticsearchelastic-stack

解决方案


推荐阅读