【问题标题】:Elastic Search Reindex : Wait for completion弹性搜索重新索引:等待完成
【发布时间】:2024-12-12 03:05:02
【问题描述】:

我正在尝试使用 Nest C# 重新索引 2695140 个文档。我需要计算重新索引所有文档所需的时间,为此我已经编写了日志。但是在运行 1 分钟后,我的代码返回了一个无效响应(失败),但是由于我们触发了弹性搜索的 Reindex endint,文档得到了正确的索引。

我希望我的代码应该等到重新索引操作完成,以便我可以计算重新索引所需的总时间。下面是我正在使用的代码

return await Client.ReindexOnServerAsync(selector => selector
                                .Source(src => src
                                  .Index(_config.SomeIndex))
                               .Destination(dest => dest
                                  .Index(newIndexName).OpType(OpType.Index))
                               .WaitForCompletion(true));

提前致谢。

【问题讨论】:

    标签: elasticsearch elasticsearch-rest-client


    【解决方案1】:

    我希望我的代码应该等到重新索引操作完成 完成

    我不知道您使用的是哪种编程语言,但对于遵循“每个请求一个线程”模型的语言来说,等待重新索引操作是不明智的。操作所花费的时间将与要重新索引的文档数量成正比,并且它会阻塞线程(消耗资源)直到操作完成。

    您应该:

    1. 无需等待完成即可重新索引,例如:
    POST _reindex?wait_for_completion=false
       {
        "source":{
            "index":"book"
        },
        "dest":{
            "index":"book_new1"
        }
    }
    

    响应:会有task_id

    1. 使用tasks API 来跟踪任务的完成情况。它还将包含请求是否成功的状态以及操作所花费的时间。任务 API 的示例响应如下所示:
    {
      "completed" : true,
      "task" : {
        "node" : "jF8smI1eR1mwwNxl8_7z2A",
        "id" : 2427911
        },
        "description" : "reindex from [book] to [book_new1][_doc]",
        "start_time_in_millis" : 1600335207787,
        "running_time_in_nanos" : 640430472,
        "cancellable" : true,
        "headers" : { }
      },
      "response" : {
        "took" : 634,  // <====== Time taken by operation
        "timed_out" : false,
        "total" : 3,
        "updated" : 0,
        "created" : 3,
        "deleted" : 0,
        "batches" : 1,
        "version_conflicts" : 0,
        "noops" : 0
      }
    }
    
    1. 您可以定期检查(使用 cron/scheduler/etc)直到完成并采取必要的措施。

    【讨论】:

    • 谢谢@Sahil Gupta。它可能会帮助我获得执行时间。我必须更新我的逻辑以获取 ID 并使用另一个请求进行检查。
    • 您能否接受它作为答案,如果对您有帮助,请点赞。
    • 我仍在等待一些我不应该点击逻辑的东西,以便稍后根据 ID 检查执行时间。我的功能与此操作无关。 WaitForCompletion(true)) 没有等待超过一分钟,我希望我的逻辑等到操作完成。
    【解决方案2】:

    除了@sahil-gupta 答案,请查看此选项wait for completion - 启动异步任务后,您可以等待特定任务甚至所有已启动的任务 使用另一个请求完成:

    curl "http://127.0.0.1:9200/_tasks/?wait_for_completion=true&timeout=100s"
    

    请注意,除了标准的超时响应(json,与timeout 查询参数相关)之外,它最终可能会出现如下错误:

    context deadline exceeded (Client.Timeout exceeded while awaiting headers)

    因此需要用一个简单的循环这样的请求来处理possible-long-tasks

    【讨论】: