【问题标题】:Bulk Update on ElasticSearch using NEST使用 NEST 对 ElasticSearch 进行批量更新
【发布时间】:2016-05-02 02:04:27
【问题描述】:

我正在尝试使用 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 进行批量更新或删除?

【问题讨论】:

    标签: elasticsearch nest elasticsearch-bulk-api


    【解决方案1】:

    您将批量请求传递给ElasticsearchClient,即ElasticClient.Raw,此时您应该将它传递给可以接受批量请求类型的ElasticClient.BulkAsync()ElasticClient.Bulk()

    使用BulkRequestBulkDescriptortwo different approaches that are offered by NEST for writing queries;前者使用 Object Initializer Syntax 构建请求对象,而后者在 Fluent API 中使用 lambda 表达式构建请求。

    在您的示例中,BulkDescriptor 在流式 API 的上下文之外使用,但 BulkRequestBulkDescriptor 都实现了 IBulkRequest,因此可以传递给 ElasticClient.Bulk(IBulkRequest)

    至于使用哪个,在这种情况下,你喜欢哪个都没有关系。

    【讨论】:

    • 感谢 Russ Cam 的评论。我使用 BulkDescriptor 是有道理的。如果任何批量更新失败,您对如何回滚有任何想法吗?。
    • 您的意思是在一个批量请求中回滚所有更新?简而言之,您不能因为批量请求中的每个更新都独立于其他更新,即它不是事务性的。如有必要,您可以重试失败的操作,但没有内置的回滚方式
    猜你喜欢
    • 2022-08-10
    • 2021-11-12
    • 2015-08-18
    • 2021-12-24
    • 1970-01-01
    • 2016-05-12
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多