2017-12-16 3 views
0

Nicht ganz sicher, wie diese Frage zu bilden, damit ich in ein Beispiel springen werde. Angenommen, ich habe folgende Dokumente:Verschachtelte Begriffe Aggregation, die über Geschwister aggregiert

{ 
    elements: [ 
     {name: 'foo'}, 
     {name: 'bar'}, 
     {name: 'baz'} 
    ] 
}, 
{ 
    elements: [ 
     {name: 'foo'}, 
     {name: 'baz'} 
    ] 
} 

Wo elements verschachtelte Dokumente enthalten. Ich möchte in der Lage sein, über alle name zu aggregieren und zählt, wie oft ein Geschwister mit diesem Element erscheint.

I.e.

{ 
    foo: { 
     bar: 1, 
     baz: 2 
    }, 
    bar: { 
     foo: 1, 
     baz: 1 
    }, 
    baz: { 
     foo: 2, 
     bar: 1 
    } 
} 

Gibt es eine gute Möglichkeit, dies mit elasticsearch aggregations zu tun? Mein primitives Verständnis von Aggregationen in ES hatte mich etwas tun wie:

"aggs": { 
    "elements": { 
     "nested": { 
      "path": "elements" 
     }, 
     "aggs": { 
      "names": { 
       "terms": { 
        "field": "elements.name", 
        "size": 20 
       }, 
       "aggs": { 
        "more_elements": { 
         "terms": { 
          "field": "elements.name", 
          "size": 20 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Welche gibt völlig falsche Ergebnisse. Ich am Ende immer etwas, wie:

{ 
    foo: { 
     doc_count: 2, 
     foo: 2 
    }, 
    bar: { 
     doc_count: 1, 
     foo: 1 
    }, 
    baz: { 
     doc_count: 2, 
     foo: 2 
    } 
} 

Jede Hilfe ist sehr zu schätzen! Ich verwende derzeit ES 5.4, wenn das wichtig ist.

Antwort

0

Kann nicht einen Weg finden, es in einem Schritt zu tun. Ich werde es zwei Schritte trennen:

Schritt 1: Finden Sie alle elements.names:

{ 
    "size": 0, 
    "aggs": { 
    "elements": { 
     "nested": { 
     "path": "elements" 
     }, 
     "aggs": { 
     "names": { 
      "terms": { 
      "field": "elements.name", 
      "size": 20 
      } 
     } 
     } 
    } 
    } 
} 

Schritt 2: für jedes element.name tun:

{ 
    "size": 0, 
    "aggs": { 
    "bool_agg": { 
     "filter": { 
     "bool": { 
      "must": { 
      "term": { 
       "elements.name": "NAME_HERE" 
      } 
      } 
     }, 
     "aggs": { 
      "names": { 
      "terms": { 
       "field": "elements.name", 
       "size": 20 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Darauf achten, dass Ich verwende hier keine verschachtelte Aggregation - die filter aggregation würde jedes (vollständige) Dokument filtern, das den aktuellen Namen enthält. Als bekomme ich nur die Erscheinungsnummer jedes Geschwisters (und auch den aktuellen Namen - aber es kann auch entfernt werden).

Verwandte Themen