2016-05-09 15 views
2

Gibt es eine Möglichkeit, mehrere nicht geschachtelte Aggregationen für Felder in der elastischen Suche auszuführen? Ich möchte, dass alle meine Aggregationen Kind oder Eltern sind, aber auf der gleichen Ebene.Mehrere nicht geschachtelte Aggregationen

{ 
    "size": 0, 
    "aggs": { 
     "one": { 
      "terms": { 
       "field": "A" 
      }, 
      "aggs": { 
       "two": { 
        "terms": { 
         "field": "B" 
        }, 
        "aggs": { 
         "three": { 
          "terms": { 
           "field": "C" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Antwort

0

so habe ich festgestellt, dass Begriffe Aggregation nicht das Sammeln von Begriffen aus mehreren Feldern im selben Dokument unterstützt. Außerdem gibt es zwei Ansätze, die verwendet werden können, um einen Begriff agg über mehrere Felder hinweg auszuführen: script und copy_to-Feld während des Mappings.

1

ElasticSearch hat grob 3 Arten von Aggregationen.

Bucket - Ermöglicht die Bildung von "Buckets" verschiedener Typen. Begriffe (in nicht analysierten String-Feldern), Zeitintervalle (Datums-Histogramm-Aggregationen, wenn Ihre Daten einen "Zeitstempel" -Typ haben), geographische Formen (Geo-Hash-Aggregationen, wenn Ihre Daten Längen-/Breitengrad haben).

Metric - Summe, Durchschnitt, Min, Max und numerische innerhalb Eimer oder außerhalb Eimer angewendet Aggregationen (auf höchster Ebene)

Pipeline - Dies ist experimentell. Feed-Ausgabe von einer Aggregation zu einer anderen.

Sie können mehrere Bucket-Aggregationen auf derselben Ebene haben (entweder "aggs" -Element der obersten Ebene oder verschachtelte "aggs" innerhalb einer anderen Bucket-Aggregation). Sie können Bucket-Aggregationen auch ineinander verschachteln.

Für metrische Aggregationen können Sie sie auf dem obersten "aggs" -Element oder in einer anderen Bucket-Aggregation haben.

In Ihrem Beispiel, wenn A, B und C vom Typ String und not_analyzed sind. Sie können Bucket-Aggregationen wie.

{ 
    "size": 0, 
    "aggs": { 
    "one": { 
     "terms": { 
     "field": "A" 
     }, 
     "aggs": { 
     "two": { 
      "terms": { 
      "field": "B" 
      } 
     } 
     } 
    }, 
    "aggs": { 
     "three": { 
     "terms": { 
      "field": "C" 
     } 
     } 
    } 
    } 
} 

"Eins" und "Drei" sind Begriffsaggregationen auf der obersten Ebene. "Zwei" ist in "Eins" verschachtelt.

Wenn Sie zusätzlich einige numerische Felder in Ihrem Dokument hatten. Sagen wir zum Beispiel D und E. Sie wollen die Summe von D innerhalb jedes Buckets von A und jedes Buckets von B berechnen, Summe von E in jedem Bucket von B. Auch Summe von D in jedem Bucket von C. Sie können alle von ihnen tun gleichzeitig in einer Abfrage, in einem Durchgang ...

{ 
    "size": 0, 
    "aggs": { 
    "one": { 
     "terms": { 
     "field": "A" 
     }, 
     "aggs": { 
     "sumOfDWithinA": { 
      "sum": { 
      "field": "D" 
      } 
     }, 
     "two": { 
      "terms": { 
      "field": "B" 
      }, 
      "aggs": { 
      "sumOfDWithinB": { 
       "sum": { 
       "field": "D" 
       } 
      }, 
      "sumOfEWithinB": { 
       "sum": { 
       "field": "E" 
       } 
      } 
      } 
     } 
     } 
    }, 
    "aggs": { 
     "three": { 
     "terms": { 
      "field": "C" 
     }, 
     "aggs": { 
      "sumOfDWithinC": { 
      "sum": { 
       "field": "D" 
      } 
      } 
     } 
     } 
    } 
    } 
}