2014-05-22 9 views
18

Sto tentando di aggiornare un documento indicizzato esistente. Ho tag indicizzati, titolo e campo proprietari. Ora, quando l'utente cambia il titolo, ho bisogno di trovare e aggiornare il documento all'interno dell'indice.Come si aggiorna un documento esistente all'interno dell'indice ElasticSearch usando NEST?

Devo aggiornare e sostituire l'intero documento o solo il campo del titolo?

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

Semplicemente non funziona. Il codice sopra genera un errore di sintassi. Qualcuno conosce il modo corretto per farlo usando il client C# NEST di ElasticSearch?

risposta

15

Ho aggiornato con successo gli articoli esistenti nel mio indice Elasticsearch con NEST utilizzando un metodo simile al seguente. Nota in questo esempio, è solo necessario inviare un documento parziale con i campi che si desidera aggiornare.

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

Puoi trovare altri esempi di modi per inviare aggiornamenti in NEST Update Unit Tests from the GitHub Source.

+0

updateDoc.Title = "Il mio nuovo titolo"; non è corretto, dà errore di sintassi. Proverò in vari modi – kheya

+0

dinamico MyDynamic = new System.Dynamic.ExpandoObject(); è come l'ho fatto – kheya

+0

Come si ottiene il 'doc.Id'? Devo prima cercare un documento? – JedatKinports

3

Per Nest 2 per aggiornare un POCO che già includono un campo ID:

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

in realtà per Nest 2 si tratta di:

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)) 
Problemi correlati