Массовое обновление ElasticSearch с использованием NEST

Я пытаюсь заменить документы на ES с помощью NEST. Я вижу следующие варианты доступны.

Опция 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

Вы передаете насыпной запрос ElasticsearchClient т.е. ElasticClient.Raw, когда вы должны передать его в ElasticClient.BulkAsync() или ElasticClient.Bulk(), который может принимать насыпной тип запроса.

Использование BulkRequest или BulkDescriptor - это два разных подхода, которые предлагаются NEST для написания запросов; первый использует синтаксис инициализатора объекта для создания объекта запроса, а второй используется в API Fluent для создания запроса с использованием лямбда-выражений.

В вашем примере BulkDescriptor используется вне контекста BulkRequest API, но и BulkRequest и BulkDescriptor реализуют IBulkRequest поэтому могут быть переданы в ElasticClient.Bulk(IBulkRequest).

Что касается того, что использовать, в этом случае это не имеет значения так, как вы предпочитаете.