我尝试使用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选项都抛出此类异常?
看来索引是最安全的选项。这样使用可以吗?
最佳答案
使用sync
或async
不会对Elasticsearch索引编制性能产生任何影响。如果不想在完成索引编制时阻塞客户端代码,就需要使用async
。
对于Index
和IndexMany
,始终建议使用后者来利用批处理的优势,并避免客户端和Elasticsearch之间的请求/响应周期过多。就是说,您不能简单地在单个请求中索引如此大量的文档。异常消息很清楚,您的批处理索引请求已超过HTTP内容长度限制100MB。您需要做的是减少您要使用IndexMany
编制索引的文档的数量,这样您就不会达到此限制,然后多次调用IndexMany
直到完成对所有500,000个文档的编制索引。