2015-09-09 5 views
0

У меня есть данные, индексированные с использованием ElasticSearch, и у меня возникают проблемы с обновлением определенного поля. Отрывок из JSON выглядит следующим образом:ElasticSearch.Net - Обновление массива с несколькими компонентами

{ 
"_index": "indexName", 
"_type": "type", 
"_id": "00001", 
"colors": [ 
    "red", 
    "green" 
] 
"place": "london", 
"person": [ 
     { 
      "name": "john", 
      "age": "27", 
      "eyes": "blue" 
     } 
     { 
      "name": "mary", 
      "age": "19", 
      "eyes": "green" 
     } 

] 
} 

мне нужно добавить в новый person объект, что-то вроде:

{ 
    "name": "jane", 
    "age": "30", 
    "eyes": "grey" 
} 

У меня People определяется следующим образом:

public class People 
{ 
    public List<string> colors {get; set; } 
    public string place {get; set; } 
    public List<Person> person {get; set; } 
} 
public class Person 
{ 
    public string name {get; set; } 
    public string age {get; set; } 
    public string eyes {get; set; } 
} 

Я обновил color без проблем:

client.Update<People>(u => u 
    .Id(u.Id) 
    .Index(u.Index) 
    .Type(u.Type) 
    .Script("if ctx._source.containsKey(\"color\")) { ctx._source.color += color; } else { ctx._source.color = [color] }") 
    .Params(p => p 
     .Add("color", "pink")) 
); 

Я не могу понять, как обновить поле person, хотя это список Person объектов, а не список строк.

Любая помощь очень ценится!

ответ

2

Я сделал это ранее с помощью анонимного объекта и отправки частичного обновления документа в Elasticsearch только для обновления необходимого раздела.

Вот фрагмент кода, который должен работать ...

var peopleId = //Get Id of document to be updated. 
var persons = new List<Person>(3); 
persons.Add(new Person { name = "john", eyes = "blue", age = "27" }); 
persons.Add(new Person { name = "mary", eyes = "green", age = "19" }); 
persons.Add(new Person { name = "jane", eyes = "grey", age = "30" }); 

var response = Client.Update<People, object>(u => u 
      .Id(peopleId) 
      .Doc(new { person = persons}) 
      .Refresh() 
     ); 
+0

Ничего хорошего - ничего не обновляется. Я пробовал разные варианты передачи объекта Person в оператор обновления, ни один из которых не работал. – helencrump

+0

Похоже, что свойство .Doc должно быть установлено с обновлением. Я обновил свой пример выше. Возможно, вы захотите попробовать использовать анонимный объект, как показано в документации NEST, - http://nest.azurewebsites.net/nest/core/update.html под анонимными объектами в виде частичных документов. –

+0

Я пробовал это тоже без успеха, но спасибо за предложение. :) – helencrump

 Смежные вопросы

  • Нет связанных вопросов^_^