我正在尝试为以下结构的文档创建映射:
"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找到一种复杂的方法。
感谢任何提示
答案 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();