我在 ASP.NET Core 控制台应用程序中使用 Nest 库从 Postgres 数据库读取数据并插入弹性搜索时遇到问题。
我的做法:
它可以进行 9 或 10 次迭代,但有时在 ES 中会失败。
而且这个过程需要很长时间,我说的只是 Elastic 搜索插入时间。
错误:
由于配置的 HttpClient.Timeout 已过 60 秒,请求被取消
TimeoutException:操作被取消。
IOException:无法从传输连接读取数据:由于线程退出或应用程序请求,I/O 操作已中止..
SocketException:由于线程退出或应用程序请求,I/O 操作已中止。
谁能帮我解决这个问题,并告诉我如何成功地将 10 多万条记录插入到 Elastic Search 中?
我不确定问题是否与您的解决方案中的其他内容有关,但这对我有用:
var chunks = item.Items.Chunk(5000);
foreach (var chunk in chunks)
{
await nestClient.BulkAsync(x => x.Index(item.Index).UpdateMany(chunk, (y, z) => y.IdFrom(z, true).Doc(z).Id(z.Id).RetriesOnConflict(2)));
}
您可能想检查您的客户端(我的客户端)上最需要的超时:
ConnectionSettings settings = new ConnectionSettings(pool)<other settings>.RequestTimeout(TimeSpan.FromMinutes(3))
减小批量的大小,因为 10000 可能太大。通常的大小是 1000。这实际上取决于您的硬件和 Elasticsearch 集群配置,但显然如果您遇到问题,您应该减少批量大小。
建立索引时,将索引上的副本数设置为 0,并将刷新间隔设置为 -1。这样,Elasticsearch 完全致力于为您的数据建立索引,它不会花费资源来复制数据或合并段。