2016-01-25 4 views
7

J'essaie de remplacer les documents sur ES en utilisant NEST. Je vois les options suivantes sont disponibles.Mise à jour en masse sur ElasticSearch en utilisant NEST

Option 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); 

Option # 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); 

Alors quelqu'un peut me dire quel est le meilleur ou toute autre option pour faire des mises à jour en vrac ou en utilisant NEST supprime?

Répondre

3

Vous passez la demande en vrac au ElasticsearchClient à savoir ElasticClient.Raw, quand vous devriez le passer à ElasticClient.BulkAsync() ou ElasticClient.Bulk() qui peut accepter un type de demande en vrac.

en utilisant BulkRequest ou BulkDescriptor sont two different approaches that are offered by NEST for writing queries; la première utilise une syntaxe Object Initializer Syntaxe pour créer un objet de requête alors que ce dernier est utilisé dans l'API Fluent pour générer une requête à l'aide d'expressions lambda.

Dans votre exemple, BulkDescriptor est utilisé en dehors du contexte de l'API couramment, mais les deux BulkRequest et BulkDescriptor mettre en œuvre IBulkRequest peut donc être passé à ElasticClient.Bulk(IBulkRequest).

En ce qui concerne l'utilisation, dans ce cas, peu importe ce que vous préférez.

+0

Merci Russ Cam pour votre commentaire. Il est logique que j'ai utilisé BulkDescriptor. Avez-vous une idée sur la façon de restaurer si une mise à jour en masse échoue? – Sasi

+0

Vous voulez annuler toutes les mises à jour dans une demande groupée? En bref, vous ne pouvez pas car chaque mise à jour dans la demande en bloc est indépendante des autres, c'est-à-dire qu'elle n'est pas transactionnelle. Vous pouvez réessayer les opérations échouées si nécessaire, mais pas de manière intégrée pour annuler –

+0

OK. merci encore pour votre réponse. – Sasi