使用NEST对ElasticSearch进行批量更新

时间:2016-01-25 17:01:34

标签: elasticsearch nest elasticsearch-bulk-api

我正在尝试使用NEST替换ES上的文档。我看到以下选项可用。

选项#1:

var documents = new List<dynamic>();

`var blkOperations = documents.Select(doc => new BulkIndexOperation<T>`(doc)).Cast<IBulkOperation>().ToList();   
var blkRequest = new BulkRequest()
{
    Refresh = true,
    Index = indexName,
    Type = typeName,
    Consistency = Consistency.One,
    Operations = blkOperations
};
var response1 = _client.Raw.BulkAsync<T>(blkRequest);

选项#2:

var descriptor = new BulkDescriptor();
foreach (var eachDoc in document)
{
    var doc = eachDoc;
    descriptor.Index<T>(i => i
        .Index(indexName)
        .Type(typeName)
        .Document(doc));
}
var response = await _client.Raw.BulkAsync<T>(descriptor);

那么有人能告诉我哪个更好或者使用NEST进行批量更新或删除的其他选项吗?

1 个答案:

答案 0 :(得分:5)

您将批量请求传递给ElasticsearchClient,即ElasticClient.Raw,当您将其传递给可以接受批量请求类型的ElasticClient.BulkAsync()ElasticClient.Bulk()时。

使用BulkRequestBulkDescriptortwo different approaches that are offered by NEST for writing queries;前者使用对象初始化语法来构建请求对象,而后者在 Fluent API 中使用,以使用lambda表达式构建请求。

在您的示例中,BulkDescriptor在Fluent API的上下文之外使用,但BulkRequestBulkDescriptor都实现了IBulkRequest,因此可以传递给{{1} }}

至于使用哪种,在这种情况下,无论您喜欢哪种都无关紧要。