Как обновить существующий документ внутри индекса 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?
Ответы
Ответ 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));