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"
}
}
}
}'
ElasticSearch-Leitfaden
- ElasticSearch Tutorial für Anfänger: ElasticSearch Grundlagen
- Verwendung von Apache Hive mit ElasticSearch
- Verwendung von ElasticSearch mit Apache Spark
- Curl ElasticSearch Befehle Spickzettel
- Spark ElasticSearch Hadoop-Update und Upsert Beispiel und Erklärung
- Wie man Apache Spark-Daten mit Python in ElasticSearch schreibt
- ElasticSearch-Suchsyntax sowie boolesche und Aggregationssuchen
- ElasticSearch verschachtelte Abfragen: Wie man nach eingebetteten Dokumenten sucht
- ElasticSearch Joins: Has_Child, Has_parent Abfrage
- Wie man einen elastischen Cluster der Version 7 einrichtet
- Wie man Filebeat für nginx und ElasticSearch konfiguriert
- Beats und Logstash verwenden, um Logs an ElasticSearch zu senden
- Wie man eine CSV-Datei mit Logstash in ElasticSearch lädt
- ElasticSearch-Aggregationen erklärt
- Was ist der ELK-Stack?
- Logstash 101: Verwendung von Logstash in einer Datenverarbeitungspipeline
- Verwendung von Kibana zur Ausführung von Abfragen in ElasticSearch mit Lucene und Kibana Query Language
- ElasticSearch Maschinelles Lernen
- Wie man Elastic Enterprise Search installiert
- Wie man Elastic Enterprise Search mit GitHub verwendet
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.