1

我正在尝试使用 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));

提前致谢。

4

2 回答 2

0

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

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

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

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

因此需要通过此类请求的简单循环来处理可能的长时间任务。

于 2021-07-14T08:52:48.653 回答
0

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

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

相反,您应该:

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

响应:会有task_id

  1. 使用任务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)直到完成并采取必要的措施。
于 2020-09-17T09:55:45.173 回答