2016-01-25 23 views
7

NESTを使用してESのドキュメントを置き換えようとしています。私は次のオプションが利用可能であることを見ている。NESTを使用したElasticSearchの一括アップデート

オプション#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を使用して削除私に言うことができますか?

答えて

3

あなたはバルク要求タイプを受け入れることができElasticClient.BulkAsync()またはElasticClient.Bulk()に渡すべきであるとき、ElasticsearchClientすなわちElasticClient.Rawに一括要求を渡しています。

BulkRequestまたはBulkDescriptorは、two different approaches that are offered by NEST for writing queriesです。前者はオブジェクト初期化構文を要求オブジェクトの構築に使用し、後者はλ30表現を使用して要求を構築するためにFluent API内で使用されます。あなたの例では

BulkDescriptorは流暢なAPIのコンテキストの外部で使用されているが、両方のBulkRequestBulkDescriptorのでIBulkRequestを実装するには、ElasticClient.Bulk(IBulkRequest)に渡すことができます。

この場合、どちらの方が好きかは関係ありません。

+0

Russ Camに感謝します。私はBulkDescriptorを使用したことは意味があります。一括更新のいずれかが失敗した場合にロールバックする方法はありますか? – Sasi

+0

1回のバルクリクエストですべての更新をロールバックするという意味ですか?要するに、バルクリクエスト内のそれぞれのアップデートが他と独立している、つまりトランザクションではないからです。必要に応じて失敗した操作を再試行できますが、ロールバックする方法は組み込まれていません。 –

+0

OK。あなたの返事にもう一度感謝します。 – Sasi

関連する問題