#c# #elasticsearch #nest
#c# #elasticsearch #гнездо
Вопрос:
мой вопрос заключается в следующем. У меня есть тип данных, который состоит из словаря.
Data d = new Data();
d.Id = "1"
d.Items.Add("item1", "hello");
d.Items.Add("item2", "world");
Теперь я хочу удалить элемент с ключом item1.
d.Items.Remove("item1");
Index.Update(d);
Мой метод обновления выглядит следующим образом:
client.Update<Data>(u => u
.Index("defaultindex")
.Type("data")
.Document(d)
.Id(d.Id)
.RetryOnConflict(5)
.Refresh()
);
Но элемент с ключом item1 все еще остается. Кто-нибудь знает, как я могу указать методу обновления удалить эту запись?
Ответ №1:
Обновление может произойти либо с помощью скрипта, либо с помощью обновленного документа. В вашем случае вы обновляете с помощью опции document, но вы указываете тип сценария в своем вызове, потому что вы используете Update<T>
, а не Update<T,K>
. Вы можете увидеть пример обновления скрипта в Nest Update с помощью Script API.
Попробуйте изменить свой код на следующий, и вы должны увидеть это обновление, как вы ожидаете.
client.Update<Data, Data>(u => u
.Index("defaultindex")
.Type("data")
.Document(d)
.Id(d.Id)
.RetryOnConflict(5)
.Refresh()
);
Вы даже можете просто отправить частичное обновление и обновить только Items
раздел.
var updateDocument = new System.Dynamic.ExpandoObject();
var newItems = new Dictionary<string, string>();
newItems.Add("item2","world");
updateDocument.Items = newItems;
client.Update<Data, object>(u => u
.Index("defaultindex")
.Type("data")
.Document(updateDocument)
.Id(d.Id)
.RetryOnConflict(5)
.Refresh()
);
Надеюсь, это поможет.
Комментарии:
1. спасибо за быстрый ответ. Я попробовал оба (полный и частичный), но оба по-прежнему терпят неудачу: (
2. Я только что обновил второй пример, понял, что пропустил важную часть. Если это все еще не работает, у меня нет идей, так как это то, что я использую с успехом.
3. Нет, все еще не работает, может быть неправильная настройка в сопоставлении или что-то в этом роде, что может быть причиной?