XContentBuilder内部对象的Elasticsearch映射

时间:2014-01-13 10:27:11

标签: mapping elasticsearch

我正在尝试为以下结构的文档创建映射:

"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个可能的属性..

我目前正在使用XContentBuilder生成映射json,这对我来说非常好。

我想要做的是,将内部部件的映射封装在单独的构建器中的“values”中,因为它使得映射过程更容易为我维护。此外,我已经在列表中有内部属性的名称,我想迭代它。

这是我的法线贴图代码。

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 个答案:

答案 0 :(得分:11)

每个方法调用都会突变XContentBuilder,构建器模式只是为了方便起见。所以你可以随时中断链接的电话

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();