J'essaie de mettre à jour un document indexé existant. J'ai indexé les balises, le titre et le champ des propriétaires. Maintenant, lorsque l'utilisateur modifie le titre, je dois trouver et mettre à jour le document à l'intérieur de l'index.
Dois-je mettre à jour et remplacer l'intégralité du document ou simplement le champ 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. Quelqu'un connaît-il la bonne façon de procéder en utilisant le client C # NEST d'ElasticSearch?
J'ai réussi à mettre à jour les éléments existants dans mon index Elasticsearch avec NEST en utilisant une méthode comme la suivante. Notez que dans cet exemple, vous n'avez qu'à 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 pouvez trouver plus d'exemples de façons d'envoyer des mises à jour dans le NEST Update Unit Tests from the GitHub Source .
En fait, pour Nest 2, c'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))
Pour que Nest 2 mette à jour un POCO contenant déjà un champ ID:
var task = client.UpdateAsync<ElasticsearchDocument>(
new DocumentPath<ElasticsearchDocument>(doc), u =>
u.Index(indexName).Doc(doc));
Une meilleure solution dans Nest 7.x:
await _client.UpdateAsync<ElasticSearchDoc>(doc.Id, u => u.Index("movies").Doc(new ElasticSearchDoc { Title = "Updated title!" }));