我正在尝试将数据从SQL批量插入到ElasticSearch索引。下面是我正在使用的代码,总记录数约为150万。我认为这与连接设置有关,但我无法弄明白。有人可以帮助您使用此代码或建议更好的方法吗?
public void InsertReceipts
{
IEnumerable<Receipts> receipts = GetFromDB() // get receipts from SQL DB
const string index = "receipts";
var config = ConfigurationManager.AppSettings["ElasticSearchUri"];
var node = new Uri(config);
var settings = new ConnectionSettings(node).RequestTimeout(TimeSpan.FromMinutes(30));
var client = new ElasticClient(settings);
var bulkIndexer = new BulkDescriptor();
foreach (var receiptBatch in receipts.Batch(20000)) //using MoreLinq for Batch
{
Parallel.ForEach(receiptBatch, (receipt) =>
{
bulkIndexer.Index<OfficeReceipt>(i => i
.Document(receipt)
.Id(receipt.TransactionGuid)
.Index(index));
});
var response = client.Bulk(bulkIndexer);
if (!response.IsValid)
{
_logger.LogError(response.ServerError.ToString());
}
bulkIndexer = new BulkDescriptor();
}
}
代码工作正常但需要大约10分钟才能完成。当我尝试增加批量大小时,它失败并出现以下错误:
无效的低级别呼叫构建的无效NEST响应 POST:/ _bulk
无效的批量项:OriginalException:System.Net.WebException:The 底层连接已关闭:a上发生意外错误 发送。 ---&GT; System.IO.IOException:无法将数据写入 传输连接:强制关闭现有连接 远程主机。 ---&GT; System.Net.Sockets.SocketException:现有的 连接被远程主机强行关闭
答案 0 :(得分:1)
一个好的起点是批量为1,000到5,000份文件,或者,如果您的文件很大,批量甚至更小。
密切关注批量请求的实际大小通常很有用。一千个1KB文件与一千个1MB文件非常不同。开始玩的好体积大小约为5-15MB。
答案 1 :(得分:0)
我有类似的问题。在建立ElasticClient连接之前,通过添加以下代码解决了我的问题:
System.Net.ServicePointManager.Expect100Continue = false;