Estoy tratando de actualizar un documento indexado.
Me han indexado las etiquetas, título y los propietarios de campo. Ahora, cuando el usuario cambia el título, necesito encontrar y actualizar el documento dentro del índice.

Debo actualizar y reemplazar todo el documento o sólo en el campo de título?

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

Simplemente no funciona. El código anterior genera un error de sintaxis.
¿Alguien sabe la manera correcta de hacerlo utilizando el C# NIDO cliente de ElasticSearch?

InformationsquelleAutor kheya | 2014-05-22

4 Comentarios

  1. 18

    He actualizado correctamente los elementos existentes en mi Elasticsearch índice con NIDO utilizando un método como el siguiente. Nota en este ejemplo, sólo hay que enviar un parcial de documento con los campos que desea ser actualizado.

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

    Usted puede encontrar más ejemplos de las formas para enviar actualizaciones en el NIDO de Actualización de la Unidad de Pruebas de la Fuente de GitHub.

    • updateDoc.Title = «Mi nuevo título»; no es correcta, da error de sintaxis. Voy a tratar de varias formas diferentes
    • dinámica MyDynamic = nuevo Sistema.Dinámica.ExpandoObject(); es como yo lo hice
    • ¿Cómo conseguir que el doc.Id? ¿Tengo que consultar un documento en primer lugar?
  2. 13

    Realmente para el Nido 2 es:

    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))
  3. 4

    Para Nidos de 2 a actualizar un POCO que ya incluyen un campo de ID:

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

    Una mejor solución en el Nido 7.x:

     await _client.UpdateAsync<ElasticSearchDoc>(doc.Id, u => u.Index("movies").Doc(new ElasticSearchDoc { Title = "Updated title!" }));

Dejar respuesta

Please enter your comment!
Please enter your name here