2016-07-29 18 views
1

Nicht sicher, wie die Frage zu formulieren ist. Ich benutze Elasticsearch 2.2.Elasticsearch: Filteraggregation mit Bucket-Wert

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.

Ich benutze ein Skript zu aggregieren entweder called_entity.uuid oder coverage_entity.uuid:

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

So, jetzt die Aggregation wurde von erzeugten Bedingungen entweder header.called_entity.uuid oder header.coverage_entity.uuid.

Wie kann ich meine Aggregation mit dem Wert des Aggregationsschlüssels filtern? Zum Beispiel, wenn ich für jeden Eimer zählen möchte, wie viele Dokumente haben Uuid nur aus header.called_entity.uuid. Etwas wie das:

{ 
    "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" 
      } 
     }, 
     "from_called_entity": { 
      "filter": { 
      "term": { "header.called_entity.uuid": BUCKET_KEY } 
      } 
     } 
     } 
    } 
    } 
} 

Antwort

0

Nicht sicher, dass das möglich ist. Der Schlüssel selbst ist nur als Sortieroption verfügbar.

Könnten Sie etwas wie folgt verwenden:

{ 
    "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.sucessful_transfers" 
      } 
     } 
     } 
    }, 
    "called_entity_source": { 
     "terms": { 
     "field": "header.called_entity.uuid", 
     "size": 10 
     } 
    }, 
    "coverage_entity_source": { 
     "terms": { 
     "field": "header.coverage_entity.uuid", 
     "size": 10 
     } 
    } 
    } 
} 

Und die Ausgabe wird in etwa so sein:

"called_entity_source": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 0, 
    "buckets": [ 
     { 
      "key": "a", 
      "doc_count": 2 
     }, 
     { 
      "key": "b", 
      "doc_count": 2 
     } 
    ] 
    }, 
    "coverage_entity_source": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 0, 
    "buckets": [ 
     { 
      "key": "a", 
      "doc_count": 2 
     }, 
     { 
      "key": "b", 
      "doc_count": 1 
     } 
    ] 
    }, 
    "dim1": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 0, 
    "buckets": [ 
     { 
      "key": "a", 
      "doc_count": 4, 
      "successful_transfers": { 
       "value": 3 
      } 
     }, 
     { 
      "key": "b", 
      "doc_count": 3, 
      "successful_transfers": { 
       "value": 2 
      } 
     } 
    ] 
    } 

Wenn Sie wirklich die json in dieser spezifischen Art und Weise haben müssen, fügen Sie eine weitere Abschluss Schritt in Ihrer Anwendung, wo Sie das Ergebnis ein wenig nachbearbeiten. Das obige Ergebnis enthält die Informationen, die Sie benötigen, aber die Schlüssel aus coverage_entity_source und called_entity_source sind nicht unter der dim Aggregation.

+0

Ja, das würde für mein vereinfachtes Beispiel funktionieren, aber ich muss komplexere Filter für jede Aggregation durchführen, die boolesche Bedingungen entweder für called_entity, coverage_entity, beide und/oder andere Felder sind. Danke trotzdem ... Ich hatte gehofft, der Schlüssel könnte zumindest in einem Skript verfügbar sein, aber ich konnte nichts in den Dokumenten oder in anderen Fragen finden ... – Raphael

+0

Eigentlich funktioniert es (ich fusionierte beide Aggregationen serverseitig, nach Erhalt der Antwort von ElasticSearch). Danke vielmals! – Raphael