Отображение 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();