在c#中的Elasticsearch中插入记录花费的时间太长
本文关键字:时间 记录 中的 Elasticsearch 插入 | 更新日期: 2023-09-27 17:59:56
下面的代码从两个表table1和table2中提取数据,在字段3上对它们执行JOIN,并将其索引到Elasticsearch中。需要索引的行总数约为5亿。该代码在一小时内插入500万条记录,因此这样需要100个小时才能完成。有什么办法可以让它更快吗?
public static void selection()
{
Uri node = new Uri("http://localhost:9200");
ConnectionSettings settings = new ConnectionSettings(node);
ElasticClient client = new ElasticClient(settings);
int batchsize = 100;
string query = "select table1.field1, table2.field2 from table1 JOIN table2 ON table1.field3=table2.field3";
try
{
OracleCommand command = new OracleCommand(query, con);
OracleDataReader reader = command.ExecuteReader();
List<Record> l = new List<Record>(batchsize);
string[] str = new string[2];
int currentRow = 0;
while (reader.Read())
{
for (int i = 0; i < 2; i++)
str[i] = reader[i].ToString();
l.Add(new Record(str[0], str[1]));
if (++currentRow == batchsize)
{
Commit(l, client);
l.Clear();
currentRow = 0;
}
}
Commit(l, client);
}
catch(Exception er)
{
Console.WriteLine(er.Message);
}
}
public static void Commit(List<Record> l, ElasticClient client)
{
BulkDescriptor a = new BulkDescriptor();
foreach (var x in l)
a.Index<Record>(op => op.Object(x).Index("index").Type("type"));
var res = client.Bulk(d => a);
Console.WriteLine("100 records more inserted.");
}
感谢您的帮助!:)
您可以尝试使用较低级别的客户端,即ElasticSearchClient吗?
以下是示例-
//Fill data in ElasticDataRows
StringBuilder ElasticDataRows = new StringBuilder()
ElasticDataRows.AppendLine("{ '"index'": { '"_index'": '"testindex'", '"_type'": '"Accounts'" }}");
ElasticDataRows.AppendLine(JsonConvert.SerializeXmlNode(objXML, Newtonsoft.Json.Formatting.None, true));
var node = new Uri(objExtSetting.SelectSingleNode("settings/ElasticSearchURL").InnerText);
var config = new ConnectionConfiguration(node);
ElasticsearchClient objElasticClient = new ElasticsearchClient(config);
//Insert data to ElasticSearch
var response = ExtractionContext.objElasticClient.Bulk(Message.ElasticDataRows.ToString());
ElasticSearchClient不像NEST那样是强类型的。因此,您可以使用NewtonSoft.JSON.将类对象数据转换为JSON
根据我的测试,这比NEST API更快。
谢谢,Sameer
我们有大约40-50个数据库,每个月都会重新索引。每个DB具有1至8密耳的行。不同的是,我从MongoDB中获取数据。我正在做的是使用Parallel.Foreach,32个线程运行并插入松紧带。我只插入了一条记录,因为我需要为每一条记录计算内容,但你只需要从数据库中提取它们,并以弹性形式插入,这样大容量插入看起来更好。您可以尝试使用3-4个螺纹和大体积插入件。所以,把你的桌子分成4个,然后开始不同的线程,批量插入弹性。从我所看到的情况来看,我很确定当你从DB中阅读时,这一部分占据了大部分时间。另外,我认为你应该试着使用一个>100的批次。