2015-08-19 1 views
2

Я хочу создать документацию для моей структуры документов Elasticsearch. Проблема в том, что я храню вложенный JSON в моем индексе, но я хочу документировать flattend JSON format¹, который генерирует Elasticsearch.Как вручную сгладить Elasticsearch вложенные документы JSON с использованием Java?

Есть ли способ сгладить этот JSON аналогично тому, как Elasticsearch производит с использованием ES Java API?

Если возможно, я не хочу запускать Elasticsearch для выполнения этой задачи.

Пример JSON:

{ 
    "title": "Nest eggs", 
    "body": "Making your money work...", 
    "tags": [ "cash", "shares" ], 
    "comments": [ 
    { 
     "name": "John Smith", 
     "comment": "Great article", 
     "age":  28, 
     "stars": 4, 
     "date": "2014-09-01" 
    }, 
    { 
     "name": "Alice White", 
     "comment": "More like this please", 
     "age":  31, 
     "stars": 5, 
     "date": "2014-10-22" 
    } 
    ] 
} 

Документ будет выглядеть в этот раз Elasticsearch имеет flattend его.

{ 
    "title":   [ eggs, nest ], 
    "body":    [ making, money, work, your ], 
    "tags":    [ cash, shares ], 
    "comments.name": [ alice, john, smith, white ], 
    "comments.comment": [ article, great, like, more, please, this ], 
    "comments.age":  [ 28, 31 ], 
    "comments.stars": [ 4, 5 ], 
    "comments.date": [ 2014-09-01, 2014-10-22 ] 
} 

[1] https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-objects.html

+0

Would [нечто подобное] (http://fiddle.jshell.net/blowsie/S2hsS/show/light/) или [это] (HTTPS://github.com/hughsk/flat) помощь? Другие решения доступны [здесь] (http://stackoverflow.com/questions/19098797/fastest-way-to-flatten-un-flatten-nested-json-objects). – Val

ответ

3

я написал свой собственный алгоритм, который сглаживает карту, которая будет использоваться для создания JSON. Пример

private void flatten(Map<String, Object> map, Map<String, Object> output, String key) throws JSONException { 
     String prefix = ""; 
     if (key != null) { 
      prefix = key + "."; 
     } 
     for (Entry<String, Object> entry : map.entrySet()) { 
      String currentKey = prefix + entry.getKey(); 
      if (entry.getValue() instanceof Map) { 
       flatten((Map<String, Object>) entry.getValue(), output, prefix + entry.getKey()); 
      } else if (entry.getValue() instanceof List) { 
       output.put(currentKey, entry.getValue()); 
      } else { 
       output.put(currentKey, entry.getValue()); 
      } 
     } 
    } 

Использование:

Map<String, Object> outputMap = new TreeMap<>(); 
    flatten(inputMap, outputMap, null); 
    JSONObject json = new JSONObject(outputMap); 
    String jsonStr = json.toString(4); 
+0

Вы протестировали его? Как это работает с коллекциями? –

+0

Моя модель использует только списки, карты и строки. Списки сохраняются и карты свертываются. До сих пор я еще не сталкивался с проблемами. – Jotschi

+0

Рад, что вам удалось работать. Я спросил, потому что я сделал что-то очень похожее несколько недель назад, и было особенно сложно сгладить коллекции вложенных объектов, когда эти объекты были POJO. –