2016-11-21 3 views
0

У меня есть две агрегирования полей: `['field1', 'field2']. Оба поля - это агрегирования. То, как elasticsearch возвращает агрегаты, не очень удобно со всеми этими ведрами, а также вложением гнездования и вставки ковша. У меня возникли проблемы по преобразованию elasticsearch результатов к списку dicts например,Данные Elasticsearch для более структурированной формы

elasticsearch поддельные результаты:

'aggregations':{ 
    'field1':{ 
     'buckets':[ 
      { 
       'key':'value1', 
       'field2':{ 
        'buckets':[ 
         { 
          'key':'1.1.1.1', 
          'doc_count':15 
         }, 
         { 
          'key': '2.2.2.2', 
          'doc_count': 12 
         } 

        ] 

       } 
      }, 
      { 
       'key': 'value2', 
       'field2': { 
        'buckets': [ 
         { 
          'key': '3.3.3.3', 
          'doc_count': 15 
         }, 
         { 
          'key': '4.4.4.4', 
          'doc_count': 12 
         } 
        ] 
       } 

      }, 
      { 
       'key': 'value3', 
       'field2': { 
        'buckets': [ 
         { 
          'key': '5.5.5.5', 
          'doc_count': 15 
         }, 
         { 
          'key': '6.6.6.6', 
          'doc_count': 12 
         } 
        ] 
       } 
      } 
     ] 
    } 
} 

Я хотел бы результат быть в виде настоя:

[{'field1':'value1', 'field2':'1.1.1.1'}, 
{'field1':'value1', 'field2':'2.2.2.2'}, 
{'field1':'value2', 'field2':'3.3.3.3'}, 
{'field1':'value2', 'field2':'4.4.4.4'}, 
{'field1':'value3', 'field2':'5.5.5.5'}, 
{'field1':'value3', 'field2':'6.6.6.6'} ] 

подобно нормальная база данных со строками и столбцами. Имя агрегации должно быть именем столбца, которое необходимо. Я подумал о том, чтобы использовать некоторое древовидное представление данных, а затем после создания структуры данных дерева с помощью dfs создайте каждую строку результатов. Но нужно место для начала.

+0

Почему не разбор ведра на стороне клиента? 2-3 строки Python позаботятся о преобразовании вашего результата в нужную структуру. – Val

+0

@Val Я говорю о стороне клиента. На мой взгляд, это не очень простая проблема. Kibana делает это во втором интерфейсе, используя аналогичный подход со связанными списками и перемещая ведра и метрики. – Apostolos

ответ

0

При загрузке, что результаты агрегации JSON в словарь (json.loads('{...}')), вы можете перебирать над ним очень просто в 3 строки кода:

fields = [] 
for bucket in agg['aggregations']['field1']['buckets']: 
    for sub in bucket['field2']['buckets']: 
     fields.append({'field1': bucket['key'], 'field2': sub['key']}) 

После запуска этого field массив будет содержать именно то, что вам нужно, то есть (The JSON ниже, были получены с json.dumps(fields))

[ 
    { 
    "field2": "1.1.1.1", 
    "field1": "value1" 
    }, 
    { 
    "field2": "2.2.2.2", 
    "field1": "value1" 
    }, 
    { 
    "field2": "3.3.3.3", 
    "field1": "value2" 
    }, 
    { 
    "field2": "4.4.4.4", 
    "field1": "value2" 
    }, 
    { 
    "field2": "5.5.5.5", 
    "field1": "value3" 
    }, 
    { 
    "field2": "6.6.6.6", 
    "field1": "value3" 
    } 
] 
+0

Любая удача с этим? – Val

+0

Первое спасибо за то, что нашли время и ответили. Проблема (я должен был сказать), что количество ведер, вложенных друг в друга, известно во время выполнения и отличается. Так что да, ваш подход работает, но field1 field2 или field3 и т. Д. Неизвестны с самого начала. Поэтому нужно найти способ для клиента узнать, насколько глубоко «кроличья дыра» – Apostolos

+0

Вы можете сделать это так же, итерации по клавишам, если они не известны заранее. Я взял field1, field2 и т. Д., Чтобы показать эту идею, но даже если вы их не знаете, вы можете получить ключи словаря и перебрать их. – Val