2016-07-20 16 views
1

Nicht sicher, wie die Frage formuliert wird. Ich benutze Elasticsearch 2.2.Elasticsearch: Aggregat auf zwei Felder

Beginnen wir mit einem Beispiel des Datensatzes, aus 5 Dokumenten starten:

[ 
    { 
    "header": { 
     "called_entity": { "uuid": "a" }, 
     "coverage_entity": {}, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "a" }, 
     "coverage_entity": { "uuid": "b" }, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "b" }, 
     "coverage_entity": { "uuid": "a" }, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "b" }, 
     "coverage_entity": { "uuid": "a" }, 
     "sucessful_transfers": 0 
    } 
    } 
] 

called_entity immer hat eine Uuid. coverage_entity kann leer sein, oder haben Sie eine Uuid.

Was ich will, ist zu aggregieren entweder called_entity.uuid oder coverage_entity.uuid und dann auf die Gesamtmenge der Dokumente zählen und die Summe von successful_transfers. für diese 5 Dokumente Also, würde ich so etwas als Ergebnis hat:

uuid,doc_count,successful_transfers_count 
"a",4,3 
"b",3,2 

Das Problem ist, dass es ein gleiches Dokument bedeutet auf mehreren Aggregationen verwendet werden kann, solange die Aggregation Schlüssel ist entweder in called_entity.uuid oder coverage_entity.uuuid (Ich bin mir nicht einmal sicher, ob das möglich ist, weshalb ich hier poste).

Was ich zur Zeit mache einfach auf die aggregiert called_entity.uuid Feld, aber das ist natürlich nicht genug ist:

{ 
    "size": 0, 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "dim_1": { 
     "terms": { 
     "field": "header.called_entity.uuid", 
     "size": 0 
     }, 
     "aggs": { 
     "successful_transfers": { 
      "sum": { 
      "field": "header.successful_transfers" 
      } 
     } 
     } 
    } 
    } 
} 

Welche gibt mir so etwas wie:

uuid,doc_count,successful_transfers_count 
"a",2,2 
"b",2,1 

. ..Was ist nicht was ich will. Also, wie kann ich aggregieren auf mehrere Werte, oder für eine bestimmte Aggregation, Daten basierend auf Werten in allen Dokumenten (nicht nur die in der Aggregation) berechnen?

Vielen Dank.

Antwort

1
{ 
    "size": 0, 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "dim1": { 
     "terms": { 
     "script" : "return doc['header.called_entity.uuid'] + doc['header.coverage_entity.uuid']", 
     "size": 10 
     }, 
     "aggs": { 
     "successful_transfers": { 
      "sum": { 
      "field": "header.successful_transfers" 
      } 
     } 
     } 
    } 
    } 
} 
+0

... Verdammt. Es klappt. Ich danke dir sehr. Kannst du erklären, wie es genau funktioniert? – Raphael

+1

Diese Aggregation generiert Begriffe aus beiden Feldern: 'client_entity.uuid' und' coverage_entity.uuid' unter Verwendung dieses Skripts. Ihre Aggregation betrachte nur ein Feld und, wie Sie sagten, benötigen Sie die Werte von beiden zur gleichen Zeit. –

+0

Okay, ich denke ich weiß, wie es intern funktioniert. Vielen Dank. – Raphael