2016-11-21 3 views
0

Ich habe eine zwei Felder Unteraggregationen: `['field1', 'field2']. Beide Felder sind Term-Aggregationen. Die Art und Weise, wie elasticsearch Aggregationen zurückgibt, ist bei all diesen Buckets und Verschachtelung und Bucket-Verschachtelung nicht sehr praktisch. Ich habe Schwierigkeiten auf die Umwandlung Elasticsearch Ergebnisse zur Liste dicts, zBElasticsearch Daten in strukturiertere Form

Elasticsearch gefälschte Ergebnisse:

'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 
         } 
        ] 
       } 
      } 
     ] 
    } 
} 

ich das Ergebnis möchte in Form dies sein:

[{'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'} ] 

wie ein normale Datenbank mit Zeilen und Spalten. Der Aggregationsname muss der erforderliche Spaltenname sein. Ich habe überlegt, eine Baumdarstellung der Daten zu verwenden und dann nach dem Erstellen der Baumdatenstruktur mit dfs jede Zeile der Ergebnisse zu erstellen. Aber brauchen Sie einen Platz, um anzufangen.

+0

Warum nicht die Eimer auf der Client-Seite Parsen? 2-3 Zeilen Python würden dafür sorgen, dass Ihr Ergebnis in die gewünschte Struktur umgewandelt wird. – Val

+0

@Val Ich spreche von Client-Seite. Es ist meiner Meinung nach kein einfaches Problem. Kibana macht es im Frontend zwei mit einem ähnlichen Ansatz mit verknüpften Listen und die Buckets und Metriken durchlaufen – Apostolos

Antwort

0

Wenn Sie feststellen, dass JSON Aggregationsergebnisse in einem Wörterbuch (json.loads('{...}')) laden, können Sie dann über sie in 3 Zeilen Code sehr einfach durchlaufen:

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

Nach dem Ausführen dieser, die field Array enthält genau das, was Sie benötigen, dh (die unten JSON mit json.dumps(fields) erhalten wurde)

[ 
    { 
    "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

Irgendwelche Glück damit? – Val

+0

Zuerst danke, dass Sie sich die Zeit genommen haben und geantwortet haben. Das Problem ist (was ich hätte sagen sollen), dass die Anzahl der ineinander verschachtelten Buckets zur Laufzeit bekannt ist und sich unterscheidet. Also funktioniert dein Ansatz, aber field1 field2 oder field3 etc sind nicht von Anfang an bekannt. Also müssen Sie einen Weg finden, damit der Kunde weiß, wie tief das "Kaninchenloch" ist. – Apostolos

+0

Sie können es auf die gleiche Weise tun, indem Sie über die Schlüssel iterieren, wenn sie nicht im Voraus bekannt sind. Ich habe field1, field2, etc verwendet, um die Idee zu zeigen, aber selbst wenn Sie sie nicht kennen, können Sie die Dictionary-Schlüssel erhalten und über sie iterieren. – Val