Используя Jest или Java API, есть ли способ указать Elasticsearch создавать документы из json в виде строки?

Учитывая этот POJO:

public class People {
  String sex;
  long age;
  String names;
}

Свойство «names» будет строкой json, для которой мне нужно создать вложенные документы. Вот пример экземпляра, который мне нужно сохранить в Elasticsearch с помощью Jest Client:

People people = new People();
people.setSex("Male");
people.setAge(21);
people.setNames("[{\"fname\": \"Bob\",\"lname\": \"Smith\"},[{\"fname\": \"Mike\",\"lname\": \"Johnson\"}");

Index index = new Index.Builder(people).index("indexName").type("aType").build();
jestClient.execute(index);

Результирующий документ в ES выглядит так:

"_source" : {
  "sex" : "Male",
  "age" : 21,
  "names" : "[{\"fname\": \"Bob\",\"lname\": \"Smith\"},{\"fname\": \"Mike\",\"lname\": \"Johnson\"}]"
}

Таким образом, он взял имена строк и вставил их как буквальную строку, что имеет смысл, но на самом деле мне нужно создавать документы из каждого объекта имени. Другими словами, я хочу, чтобы это выглядело так:

"_source" : {
  "sex" : "Male",
  "age" : 21,
  "names" : [{
    "fname": "Bob",
    "lname": "Smith"
   }, {
    "fname": "Mike",
    "lname": "Johnson"
  }]
}

Я попытался добавить сопоставление, чтобы указать ES рассматривать его как «вложенное», но затем я получаю исключение синтаксического анализа Mapper, говорящее: «Пытался проанализировать поле [имена] как объект, но нашел конкретное значение».

Я знаю, что смогу сделать это, если создам реальный объект Name POJO и получу их список, но, к сожалению, из-за требований я не могу этого сделать. Я должен использовать строку JSON, предоставленную в формате, указанном выше.

РЕШЕНИЕ:

Спасибо Вишалу Рао за то, что указал мне правильное направление.

Решение состояло в том, чтобы изменить тип «имена» на JsonArray (Google GSON). Затем использовал парсер Google GSON как таковой:

People people = new People();
people.setSex("Male");
people.setAge(21);

String json = "[{\"fname\": \"Bob\",\"lname\": \"Smith\"},[{\"fname\": \"Mike\",\"lname\": \"Johnson\"}"
JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(json);
JsonArray jsonArray = jsonElement.getAsJsonArray();
people.setNames(jsonArray);

Index index = new Index.Builder(people).index("indexName").type("aType").build();
jestClient.execute(index); 

Кроме того, у меня также есть сопоставление, которое устанавливает для свойства имен вложенный тип.


person wxkevin    schedule 22.06.2016    source источник


Ответы (1)


Возможно, вы захотите сначала преобразовать свою строку в объект JSON, возможно, поэтому вы получаете эту ошибку. Elasticsearch пытается разобрать его как объект, но вместо этого находит там строку. Может быть, сделать что-то вроде:

JSONObject jsonObj = new JSONObject(names);

а затем использовать этот объект.

person Vishal Rao    schedule 22.06.2016
comment
Я разместил свое решение выше. Вы определенно поставили меня на правильный путь. Спасибо! - person wxkevin; 23.06.2016