问题描述
我正在尝试使用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));
谢谢。
解决方法
我希望我的代码应该等到重新索引操作完成 完成
我不知道您使用的是哪种编程语言,但是本质上对于遵循“每个请求一个线程”模型的语言,等待重新索引操作是不明智的。该操作花费的时间与要重新建立索引的文档数量成正比,并且阻塞线程(消耗资源)直到操作完成。
相反,您应该:
- 无需等待完成即可重新编制索引,例如:
POST _reindex?wait_for_completion=false { "source":{ "index":"book" },"dest":{ "index":"book_new1" } }
响应:将具有task_id
- 使用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 } }
- 您可以定期检查(使用cron / scheduler / etc),直到完成并采取必要的操作。
除了@sahil-gupta 的回答,请检查此选项 wait for completion - 启动异步任务后,您可以等待特定任务甚至所有已启动的任务 使用另一个请求完成:
#include <stdio.h>
#define IS_BIG_ENDIAN (!*(unsigned char *)&(uint16_t){1})
#if IS_BIG_ENDIAN
struct ieee {
unsigned long sign:1;
unsigned long expo:8;
unsigned long mantissa:23;
};
#else
struct ieee {
unsigned long mantissa:23;
unsigned long expo:8;
unsigned long sign:1;
};
#endif
int main()
{
printf ("%d\n",IS_BIG_ENDIAN);
}
请注意,除了标准超时响应(this.localDocumentData = JSON.parse(JSON.stringify(this.documentData))
,与 curl "http://127.0.0.1:9200/_tasks/?wait_for_completion=true&timeout=100s"
查询参数相关)之外,它可能会以如下错误告终:
json
所以需要用一个简单的循环来处理可能的长任务。