在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.");
        }

感谢您的帮助!:)

在c#中的Elasticsearch中插入记录花费的时间太长

您可以尝试使用较低级别的客户端,即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的批次。