我尝试使用ElasticSearch的嵌套了解索引选项,并执行了每个选项,这是我的结果:

    var node = new Uri("http://localhost:9200");
    var settings = new ConnectionSettings(node, defaultIndex: "mydatabase");
    settings.SetTimeout(1800000);
    var client = new ElasticClient(settings);
    var createIndexResult = client.CreateIndex("mydatabase");
    var mapResult = client.Map<Product>(c => c.MapFromAttributes().SourceField(s=>s.Enabled(true));

1)索引:当我通过遍历每个对象使用Index选项时,尽管速度很慢,但它可以平滑运行。
foreach (var item in Items)
{
  elasticClient.Index(item);
}

2) IndexAsync :此操作没有任何异常,但它并不比snyc迭代快,而且对的文档进行索引的次数少了
 foreach (var item in Items)
    {
      elasticClient.IndexAsync(item);
    }

3) Index很多:我尝试过的,当然没有foreach的elasticClient.IndexMany(items);,它的运行速度比foreach -index选项快,但是当我有很多数据(在我的情况下是500.000个对象)时,它抛出了异常,说



当我检查日志文件时,我只能看到



4) IndexManyAsync: elasticClient.IndexManyAsync(Items);尝试indexasnyc引发与snyc类似的异常,但我可以在日志文件中看到更多信息。



我的问题是确切的区别是什么?在什么情况下我们可能需要异步?为什么indexmany和indexmanyasnyc选项都抛出此类异常?
看来索引是最安全的选项。这样使用可以吗?

最佳答案

使用syncasync不会对Elasticsearch索引编制性能产生任何影响。如果不想在完成索引编制时阻塞客户端代码,就需要使用async

对于IndexIndexMany,始终建议使用后者来利用批处理的优势,并避免客户端和Elasticsearch之间的请求/响应周期过多。就是说,您不能简单地在单个请求中索引如此大量的文档。异常消息很清楚,您的批处理索引请求已超过HTTP内容长度限制100MB。您需要做的是减少您要使用IndexMany编制索引的文档的数量,这样您就不会达到此限制,然后多次调用IndexMany直到完成对所有500,000个文档的编制索引。

08-28 14:00