鉴于此 POJO:
public class People {
String sex;
long age;
String names;
}
“名称”属性将是一个 json 字符串,我需要为其创建嵌套文档。这是我需要使用 Jest 客户端保存到 Elasticsearch 的实例示例:
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 Parsing 异常,说“试图将字段 [names] 解析为对象,但找到了一个具体值”。
我知道如果我创建一个实际的 Name POJO 对象并拥有它们的列表,我应该能够做到这一点,但不幸的是,由于要求我无法做到这一点。我必须使用上面指定格式提供的 JSON 字符串。
解决方案:
感谢 Vishal Rao 为我指明了正确的方向。
解决方案是将“名称”类型更改为 JsonArray (Google GSON)。然后像这样使用谷歌 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);
此外,我还有一个将 names 属性设置为嵌套类型的映射。