ElasticSearch-Aggregationen erklärt

ElasticSearch-Aggregationen erklärt

  • Künstliche Intelligenz
5 Minuten Lesezeit Aktualisiert Jul 8, 2019

Auf einen Blick: ElasticSearch-Aggregationen ermöglichen es Nutzern, Daten ähnlich der SQL-GROUP BY-Funktionalität zu gruppieren und zu analysieren, etwa das Zählen von Webtreffern aus Protokollen. Diese Operationen können komplex sein und verschachtelte Abfragen ermöglichen.

  • Aggregationen können numerische und Schlüsselworttypen für eine effiziente Datenanalyse verarbeiten.
  • Gängige Typen sind Eimeraggregationen zum Zählen von Vorkommen.

ElasticSearch ermöglicht es dir, das Äquivalent einer SQL GROUP BY COUNT- und AVERAGE-Funktionen durchzuführen. Sie nennen diese Aggregationen. Mit anderen Worten: Wenn du dir nginx-Webserver-Logs ansiehst, könntest du:

  • Gruppiere jeden Webtreffer nach der Stadt, aus der der Nutzer stammt.
  • Zähle sie

Das würde dir also etwas geben wie:

Stadt Web Hits
Paris 20
London 30
Berlin 40

In SQL wäre das so etwas wie:

    select city, count(city) from logs
 group by city

Hier veranschaulichen wir dies anhand des einfachsten Anwendungsfalls, Weblogs. Folgen Sie dem vorherigen Dokument , um Ihre ElasticSearch-Instanz mit einigen nginx-Webserver-Logs zu füllen, falls Sie mitverfolgen möchten. Aggregation Da ElasticSearch sich um die Performance legt, gibt es einige Regeln, welche Art von Feldern Sie aggregieren können. Sie können nach jedem Zahlenfeld gruppieren, aber bei Textfeldern, die vom Typ Schlüsselwort sein müssen oder Fielddata=true haben. Sie können sich das Schlüsselwort wie einen Index vorstellen. Als wir die nginx-Daten geladen haben, haben wir nicht zuerst die Indexzuordnung erstellt. Wir haben ElasticSearch das Ganze spontan bauen lassen. Deshalb hat es sich entschieden, alle Textfelder zu indexieren, da es die vom Typ-Schlüsselwort abbildet, wie folgt:

    "geoip" : {
          "dynamic" : "true",
          "properties" : {
            "city_name" : {
              "type" : "text",
              "norms" : false,
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }

Aggregationen sind ein kompliziertes Thema. Es gibt viele Variationen. Man kann sie verschachteln, um komplexe Abfragen aufzubauen. Hier betrachten wir den einfachsten und häufigsten Anwendungsfall: Bucket-Aggregation. Das ist wie die SQL-Anweisung select, count, um einen Count nach Wert zu erzeugen. Im untenstehenden Beispiel wollen wir Web-Hits nach dem Stadtnamen zählen. Das allgemeine Muster zum Aufbau der Anweisung ist:

  • Verwende AGGS, was die Abkürzung für Aggregations ist.
  • Gib dem agg einen Namen. Hier verwenden wir cityName.
  • Sag ihm, welches Feld es verwenden soll. Hier verwenden wir die Punktnotation geoip.city_name , da city_name eine Eigenschaft von geo_ip ist. Mit anderen Worten: In einer tief verschachtelten JSON-Struktur setzt man einen Punkt, wenn man in der Hierarchie nach unten geht. Für ein JSON-Array würde man ElasticSearch-Skripting verwenden, ein Thema, das wir noch nicht behandelt haben.
  • Füge das Wort Keyword hinzu, um ihm zu sagen, dass er diesen Index verwenden soll.
  • Gib ihm den Aggregationsoperationstyp an. Hier verwenden wir Begriffe. Du kannst auch ave (Durchschnitt) und einige andere verwenden.

Sie können auch Filter verwenden, die wir unten weiter veranschaulichten. Diese Abfrage produziert also eine Anzahl der Webaufrufe nach Stadt.

    curl -XGET --user $pwd --header 'Content-Type: application/json'  https://58571402f5464923883e7be42a037917.eu-central-1.aws.cloud.es.io:9243/logstash/_search?pretty -d '{
        "aggs": {
                "cityName": {
                        "terms": {
                                "field": "geoip.city_name.keyword",
                                "size": 10
                        }

Hier sind die Ergebnisse. Wir haben ihm die Standardgröße von 10 gegeben, was bedeutet, wie weit er gehen sollte. Da wir 18 Städte in unseren Daten haben, bedeutet "sum_other_doc_count" : 8, dass 8 Datensätze ausgelassen wurden. Beachte, dass ElasticSearch viele Regeln hat, um die Leistung hochzuhalten. Beachte, dass unter jeder mit diesen Regeln ein doc_count steht. Wir hatten also 6 Web-Hits aus der Stadt Montpellier.

    "aggregations" : {
    "cityName" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 8,
      "buckets" : [
        {
          "key" : "Montpellier",
          "doc_count" : 6
        },
        {
          "key" : "Suzano",
          "doc_count" : 3
        },
        {
          "key" : "Boardman",
          "doc_count" : 2
        },
        {
          "key" : "Mazatlán",
          "doc_count" : 2
        },
        {
          "key" : "New York",
          "doc_count" : 2
        },
        {
          "key" : "San Diego",
          "doc_count" : 2
        },
        {
          "key" : "Abadan",
          "doc_count" : 1
        },
        {
          "key" : "Ashburn",
          "doc_count" : 1
        },
        {
          "key" : "Bogotá",
          "doc_count" : 1
        },
        {
          "key" : "Cambe",
          "doc_count" : 1
        }
      ]
    }
  }
}

Hier zählen wir dieselben Daten nach Antwort, z. B. 200, 404 usw. Da Antwort vom Typ lang ist, ist es nicht notwendig, am Ende ein Schlüsselwort hinzuzufügen.

    curl -XGET --user $pwd --header 'Content-Type: application/json'  https://58571402f5464923883e7be42a037917.eu-central-1.aws.cloud.es.io:9243/logstash/_search?pretty -d '{
        "aggs": {
                "responses": {
                        "terms": {
                                "field": "response",
                                "size": 10
                        }
                }
        }
}'

Hier sind die Ergebnisse. Da es in unseren Daten nur 4 Arten von Antworten gibt, wurden alle angezeigt, da es < 10 sind.

    "aggregations" : {
    "responses" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 200,
          "doc_count" : 23
        },
        {
          "key" : 400,
          "doc_count" : 13
        },
        {
          "key" : 404,
          "doc_count" : 8
        },
        {
          "key" : 304,
          "doc_count" : 5
        }
      ]
    }
  }

Hinzufügen einer Abfrage

Hier ist ein Beispiel mit einer Abfrage, um die Ergebnisse zu filtern. Dies stammt aus FDA-Arzneimittelinteraktionsdaten, die wir in unseren kommenden Beiträgen zur Analytik untersuchen werden. Diese Abfrage zählt Arzneimittelwechselwirkungen nach Arzneimitteltyp, was der gesamte Zweck der FDA-Datenbank ist, um Arzneimittelwechselwirkungen und Nebenwirkungen zu verfolgen. Dies ist also eine Bucket-Typ-Aggregationsabfrage und Unterabfrage

    curl -XGET --user $pwd --header 'Content-Type: application/json'  https://58571402f5464923883e7be42a037917.eu-central-1.aws.cloud.es.io:9243/fda/_search?pretty -d '{
"query": {
    "term": {
      "patient.drug.medicinalproduct.keyword": {
        "value": "METRONIDAZOLE"
      }
    }
  },
      "aggs" : {
         "drug": {
             "terms" : {
                "field": "patient.drug.medicinalproduct.keyword"

           }
         },
         "adverseaffect" : {
             "terms" : {
               "field": "patient.reaction.reactionmeddrapt.keyword"
             }
       }
   }
}'

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus Künstliche Intelligenz

Abonnieren Sie The Brief

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Danke

Sie haben The Brief abonniert
Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.