34 Aggregationen

Aggregationen sind eines der mächtigsten Werkzeuge in OpenSearch. Sie ermöglichen es uns, aus unseren Daten wertvolle Erkenntnisse zu gewinnen, indem sie komplexe statistische Analysen und Gruppierungen durchführen. Stellen Sie sich Aggregationen wie eine Art Berichtssystem vor, das Ihre Daten analysiert und zusammenfasst.

34.1 Grundlagen der Aggregation

Beginnen wir mit einem einfachen Beispiel. Nehmen wir an, wir betreiben einen Online-Shop und möchten verstehen, wie sich unsere Verkäufe entwickeln. Eine grundlegende Aggregation könnte so aussehen:

GET /sales/_search
{
  "size": 0,
  "aggs": {
    "average_order_value": {
      "avg": {
        "field": "total_amount"
      }
    }
  }
}

Beachten Sie den Parameter “size”: 0 - dieser gibt an, dass wir nur an den Aggregationsergebnissen interessiert sind und keine einzelnen Dokumente benötigen. Dies verbessert die Performance erheblich.

34.2 Metrische Aggregationen

Metrische Aggregationen berechnen statistische Werte aus numerischen Feldern. Lassen Sie uns verschiedene Arten von metrischen Aggregationen anhand eines Beispiels erkunden:

GET /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_stats": {
      "stats": {
        "field": "total_amount"
      }
    },
    "daily_revenue": {
      "sum": {
        "field": "total_amount"
      }
    },
    "unique_customers": {
      "cardinality": {
        "field": "customer_id"
      }
    },
    "percentiles_order_value": {
      "percentiles": {
        "field": "total_amount",
        "percents": [25, 50, 75, 95]
      }
    }
  }
}

Diese Abfrage liefert uns verschiedene statistische Kennzahlen:

34.3 Bucket-Aggregationen

Bucket-Aggregationen gruppieren Dokumente in verschiedene “Eimer” oder Kategorien. Dies ist besonders nützlich für die Analyse von Trends und Mustern:

GET /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_by_category": {
      "terms": {
        "field": "product_category",
        "size": 5
      },
      "aggs": {
        "total_revenue": {
          "sum": {
            "field": "total_amount"
          }
        },
        "avg_order_value": {
          "avg": {
            "field": "total_amount"
          }
        }
      }
    }
  }
}

Diese Aggregation zeigt uns:

34.4 Zeitbasierte Aggregationen

Für die Analyse von Trends über Zeit sind Date-Histogram-Aggregationen besonders wertvoll:

GET /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "order_date",
        "calendar_interval": "month"
      },
      "aggs": {
        "revenue": {
          "sum": {
            "field": "total_amount"
          }
        },
        "order_count": {
          "value_count": {
            "field": "order_id"
          }
        }
      }
    }
  }
}

Diese Aggregation erstellt eine Zeitreihenanalyse mit:

34.5 Verschachtelte Aggregationen

Die wahre Stärke von Aggregationen liegt in ihrer Kombinierbarkeit. Hier ein komplexeres Beispiel:

GET /sales/_search
{
  "size": 0,
  "aggs": {
    "sales_by_quarter": {
      "date_histogram": {
        "field": "order_date",
        "calendar_interval": "quarter"
      },
      "aggs": {
        "by_category": {
          "terms": {
            "field": "product_category"
          },
          "aggs": {
            "top_products": {
              "top_hits": {
                "size": 3,
                "sort": [
                  {"total_amount": "desc"}
                ]
              }
            },
            "category_stats": {
              "stats": {
                "field": "total_amount"
              }
            }
          }
        }
      }
    }
  }
}

Diese verschachtelte Aggregation liefert:

34.6 Pipeline-Aggregationen

Pipeline-Aggregationen arbeiten mit den Ergebnissen anderer Aggregationen. Sie sind besonders nützlich für die Berechnung von Trends und Veränderungen:

GET /sales/_search
{
  "size": 0,
  "aggs": {
    "monthly_sales": {
      "date_histogram": {
        "field": "order_date",
        "calendar_interval": "month"
      },
      "aggs": {
        "revenue": {
          "sum": {
            "field": "total_amount"
          }
        }
      }
    },
    "monthly_growth": {
      "derivative": {
        "buckets_path": "monthly_sales>revenue"
      }
    },
    "cumulative_revenue": {
      "cumulative_sum": {
        "buckets_path": "monthly_sales>revenue"
      }
    }
  }
}

Diese Aggregation berechnet:

34.7 Praktische Anwendungsfälle

34.7.1 Verkaufsanalyse

Eine umfassende Verkaufsanalyse könnte so aussehen:

GET /sales/_search
{
  "size": 0,
  "aggs": {
    "daily_sales": {
      "date_histogram": {
        "field": "order_date",
        "calendar_interval": "day"
      },
      "aggs": {
        "revenue": {
          "sum": {
            "field": "total_amount"
          }
        },
        "categories": {
          "terms": {
            "field": "product_category",
            "size": 3
          },
          "aggs": {
            "revenue": {
              "sum": {
                "field": "total_amount"
              }
            }
          }
        }
      }
    },
    "total_stats": {
      "stats": {
        "field": "total_amount"
      }
    }
  }
}

34.7.2 Kundenanalyse

Für die Analyse des Kundenverhaltens:

GET /sales/_search
{
  "size": 0,
  "aggs": {
    "customer_segments": {
      "range": {
        "field": "total_amount",
        "ranges": [
          { "to": 50 },
          { "from": 50, "to": 200 },
          { "from": 200 }
        ]
      },
      "aggs": {
        "customer_count": {
          "cardinality": {
            "field": "customer_id"
          }
        },
        "average_items": {
          "avg": {
            "field": "item_count"
          }
        }
      }
    }
  }
}

34.8 Best Practices und Optimierung

Abschließend einige wichtige Hinweise für die effiziente Nutzung von Aggregationen:

Die Größe des Result-Sets sollte immer auf das Notwendige beschränkt werden. Verwenden Sie “size”: 0, wenn Sie nur an Aggregationsergebnissen interessiert sind.

Bei großen Datenmengen können Aggregationen ressourcenintensiv sein. Nutzen Sie Sampling oder Filter, um die zu verarbeitende Datenmenge zu reduzieren:

GET /sales/_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "order_date": {
              "gte": "now-1M"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "recent_sales_analysis": {
      "terms": {
        "field": "product_category",
        "size": 10
      }
    }
  }
}

Verwenden Sie das Feld “doc_values”: true in Ihrem Mapping für Felder, die häufig aggregiert werden. Dies verbessert die Performance erheblich.

Durch das Verständnis und die richtige Anwendung von Aggregationen können Sie wertvolle Einblicke in Ihre Daten gewinnen und fundierte Geschäftsentscheidungen treffen.