Подтвердить что ты не робот

Как обновить существующий документ внутри индекса ElasticSearch, используя NEST?

Я пытаюсь обновить существующий индексированный документ. У меня есть поля индексированных тегов, заголовков и владельцев. Теперь, когда пользователь меняет заголовок, мне нужно найти и обновить документ внутри индекса.

Должен ли я обновлять и заменять весь документ или просто поле заголовка?

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

Он просто не работает. Приведенный выше код генерирует синтаксическую ошибку. Кто-нибудь знает правильный способ сделать это с помощью клиента С# NEST для ElasticSearch?

4b9b3361

Ответ 1

Я успешно обновил существующие элементы в своем индексе Elasticsearch с помощью NEST, используя следующий метод. Примечание в этом примере вам нужно отправить только частичный документ с полями, которые вы хотите обновить.

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

Вы можете найти больше примеров способов отправки обновлений в Тесты NEST Update Unit из источника GitHub.

Ответ 2

На самом деле для Nest 2 это:

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

Для Nest 2 для обновления POCO, который уже содержит поле ID:

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