Отображение Elasticsearch XContentBuilder для внутренних объектов
Я пытаюсь создать отображение для документов следующей структуры:
"name":"Peter"
"id":"ABC123",
"values":{
"a":3.0123,
"b":1234
}
поэтому отображение должно выглядеть так:
{
"properties":{"_all":{"enabled":"false"},
"dynamic":"false",
"_timestamp":{"enabled":true,"store":true},
"properties": {
"name":{"type":"string"},
"id":{"type":"string"},
"values": {
"properties": {
"a": {"type":"double"},
"b":{"type":"double"}
}
}
}
}
}
на самом деле количество возможных свойств в "значениях" довольно велико, скажем, 50 возможных свойств, которые я должен включить туда..
В настоящее время я генерирую отображение json с помощью XContentBuilder, который отлично работает для меня.
что я хочу сделать, это инкапсулировать внутреннюю часть отображение в "значениях" в отдельном построителе, так как это упрощает процесс отображения для меня. Также у меня уже есть имена внутренних свойств в списке,который я хотел бы повторить.
Это мой обычный код отображения здесь.
XContentBuilder xbMapping = jsonBuilder()
.startObject() // start root
.startObject(PROPERTIES)
.startObject("_all").field("enabled", "false").endObject()
.field("dynamic", "false")
.startObject("_timestamp").field("enabled", true).field("store", true).endObject()
.startObject(PROPERTIES)
.startObject("name").field("type", "string").endObject()
.startObject("id").field("type", "string").endObject()
.startObject("values")
.startObject(PROPERTIES)
// INNER MAPPING HERE!!
.endObject()
.endObject()
.endObject()
.endObject();
Я хотел бы избежать итерации между этими startObject и endObject и больше хотел бы сделать полное сопоставление для внутреннего типа где-то еще и просто включить эту дополнительную часть там.
Я не могу найти сложный способ на данный момент с XContentBuilder.
Спасибо за любые советы
1 ответов
на XContentBuilder
мутирует с каждым вызовом метода, шаблон builder просто для удобства. Таким образом, вы можете прервать цепные вызовы в любое время
private void buildValues(XContentBuilder builder) throws IOException {
String[] values = {"a", "b"};
for (String value : values) {
builder.startObject(value).field("type", "double").endObject();
}
}
XContentBuilder xbMapping = jsonBuilder()
.startObject() // start root
.startObject(PROPERTIES)
.startObject("_all").field("enabled", "false").endObject()
.field("dynamic", "false")
.startObject("_timestamp").field("enabled", true).field("store", true).endObject()
.startObject(PROPERTIES)
.startObject("name").field("type", "string").endObject()
.startObject("id").field("type", "string").endObject()
.startObject("values")
.startObject(PROPERTIES);
buildValues(xbMapping);
xbMapping
.endObject()
.endObject()
.endObject()
.endObject();