2014-01-13 86 views
4

我想創建以下結構的文件的映射:XContentBuilder 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個可能的屬性..

我目前正在生成與XContentBuilde的映射JSON r,這對我來說真的很好。

我想要做的是將內部零件的映射封裝在單獨的構建器中的「值」中,因爲它使映射過程更易於維護。此外,我已經有一個列表中的內部屬性名稱,我想迭代。

那是我在這裏正常的映射代碼。

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的複雜方法。

感謝任何提示

回答

9

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

那就是我至今基本上至少完成了映射。我只是覺得可能有更漂亮的解決方案。 – skombijohn

+0

至於'XContentBuilder',我恐怕不會。 ES本身使用這種將構建器實例傳遞給不同方法的方法,這些方法將編寫其內容;例如http://bit.ly/19pcitB或其接口http://bit.ly/1d0KKpb – knutwalker

+0

好吧然後。我想我可以忍受這一點。謝謝! – skombijohn