2014-05-22 4 views
18

J'essaye de mettre à jour un document indexé existant. J'ai indexé les étiquettes, le titre et le champ des propriétaires. Maintenant, lorsque l'utilisateur change le titre, je dois trouver et mettre à jour le document dans l'index.Comment mettre à jour un document existant dans l'index ElasticSearch à l'aide de NEST?

Dois-je mettre à jour et remplacer le document entier ou seulement le champ de titre?

public void UpdateDoc(ElasticsearchDocument doc) 
{ 
Uri localhost = new Uri("http://localhost:9200"); 
var setting = new ConnectionSettings(localhost); 
setting.SetDefaultIndex("movies"); 
var client = new ElasticClient(setting); 

IUpdateResponse resp = client.Update<ElasticsearchDocument, IndexedDocument>(
            d => d.Index("movies") 
             .Type(doc.Type) 
             .Id(doc.Id), doc); 
} 

Cela ne fonctionne tout simplement pas. Le code ci-dessus génère une erreur de syntaxe. Est-ce que quelqu'un connaît la bonne façon de faire cela en utilisant le client C# NEST d'ElasticSearch?

Répondre

15

J'ai réussi à mettre à jour des éléments existants dans mon index Elasticsearch avec NEST en utilisant une méthode comme celle-ci. Notez dans cet exemple, vous avez seulement besoin d'envoyer un document partiel avec les champs que vous souhaitez mettre à jour.

// Create partial document with a dynamic 
    dynamic updateDoc = new System.Dynamic.ExpandoObject(); 
    updateDoc.Title = "My new title"; 

    var response = client.Update<ElasticsearchDocument, object>(u => u 
     .Index("movies") 
     .Id(doc.Id) 
     .Document(updateDoc) 
    ); 

Vous trouverez d'autres exemples de façons d'envoyer des mises à jour dans le NEST Update Unit Tests from the GitHub Source.

+0

updateDoc.Title = "Mon nouveau titre"; n'est pas correct, il donne une erreur de syntaxe. Je vais essayer quelques façons différentes – kheya

+0

dynamique MyDynamic = new System.Dynamic.ExpandoObject(); est comment je l'ai fait – kheya

+0

Comment obtenez-vous le 'doc.Id'? Dois-je d'abord demander un document? – JedatKinports

3

Nest 2 mettre à jour un POCO qui comprennent déjà un champ ID:

var task = client.UpdateAsync<ElasticsearchDocument>(
        new DocumentPath<ElasticsearchDocument>(doc), u => 
         u.Index(indexName).Doc(doc)); 
8

En fait, pour Nest 2, il est:

dynamic updateFields = new ExpandoObject(); 
updateFields.IsActive = false; 
updateFields.DateUpdated = DateTime.UtcNow; 

await _client.UpdateAsync<ElasticSearchDoc, dynamic>(new DocumentPath<ElasticSearchDoc>(id), u => u.Index(indexName).Doc(updateFields)) 
Questions connexes