Elasticsearch Aggregations – Analiza Danych w Czasie Rzeczywistym

TL;DR: Elasticsearch aggregations pozwalają na zaawansowaną analizę danych w czasie rzeczywistym. Bucket aggregations grupują dokumenty, metric aggregations obliczają statystyki, a pipeline aggregations łączą wyniki innych agregacji. Idealne dla dashboardów analitycznych i raportów biznesowych.

Dlaczego Elasticsearch Aggregations to Game Changer?

Elasticsearch aggregations to nie tylko narzędzie do wyszukiwania – to kompletny silnik analityczny. W 2019 roku, gdy big data staje się standardem, potrzebujemy narzędzi które analizują miliony dokumentów w milisekundach. Aggregations pozwalają na tworzenie dashboardów analitycznych, które konkurują z dedykowanymi rozwiązaniami BI, ale działają w czasie rzeczywistym.

Co się nauczysz:

  • Jak używać bucket aggregations do grupowania danych według różnych kryteriów
  • Wykorzystanie metric aggregations do obliczania statystyk (avg, sum, min, max)
  • Tworzenie zagnieżdżonych agregacji dla wielowymiarowej analizy
  • Pipeline aggregations do zaawansowanych obliczeń na wynikach innych agregacji
  • Optymalizacja wydajności agregacji dla dużych zbiorów danych
  • Praktyczne przypadki użycia w analizie logów i metrykach biznesowych
Wymagania wstępne: Podstawowa znajomość Elasticsearch, umiejętność pisania prostych zapytań, rozumienie JSON. Przydatna znajomość Kibana dla wizualizacji wyników.

Czym są Elasticsearch Aggregations?

Aggregations w Elasticsearch to framework do analizy danych który pozwala na grupowanie, obliczanie statystyk i transformację danych w locie. W przeciwieństwie do tradycyjnych baz danych, gdzie analiza wymaga osobnych zapytań SQL, Elasticsearch może wykonać zarówno wyszukiwanie jak i analizę w jednym żądaniu.

Aggregations to jak zaawansowany kalkulator dla danych – możesz policzyć ile masz dokumentów w każdej kategorii (bucket), jakie są średnie wartości (metric), a nawet wykonać obliczenia na wynikach poprzednich obliczeń (pipeline).

Trzy główne typy agregacji

Typ agregacjiZastosowaniePrzykład
BucketGrupowanie dokumentówSprzedaż według miesięcy
MetricObliczanie statystykŚrednia wartość zamówienia
PipelineOperacje na innych agregacjachTrend sprzedaży miesiąc do miesiąca

Bucket Aggregations – Grupowanie Danych

Bucket aggregations dzielą dokumenty na grupy (bucket) według określonych kryteriów. To podstawa większości analiz – najpierw grupujemy, potem analizujemy każdą grupę.

Terms Aggregation – Grupowanie według wartości

Najpopularniejsza agregacja do grupowania według unikalnych wartości pola:

{
  "aggs": {
    "top_categories": {
      "terms": {
        "field": "category.keyword",
        "size": 10
      }
    }
  }
}
Pro tip: Zawsze używaj pola .keyword dla terms aggregation zamiast analyzed text field. Analyzed fields są tokenizowane i dadzą nieprzewidywalne wyniki.

Date Histogram – Analiza w czasie

Kluczowa agregacja dla analizy trendów czasowych:

{
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "month",
        "format": "yyyy-MM-dd"
      }
    }
  }
}

W Elasticsearch 7.2+ używaj calendar_interval zamiast deprecated interval. Calendar intervals respektują strefy czasowe i przestępne lata.

Range Aggregation – Grupowanie według przedziałów

Przydatne do analizy segmentów cenowych, wiekowych czy innych zakresów liczbowych:

{
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 100 },
          { "from": 100, "to": 500 },
          { "from": 500 }
        ]
      }
    }
  }
}

Metric Aggregations – Obliczanie Statystyk

Metric aggregations obliczają wartości numeryczne na podstawie dokumentów w bucketach lub całego zbioru danych.

Podstawowe metryki statystyczne

{
  "aggs": {
    "price_stats": {
      "stats": {
        "field": "price"
      }
    },
    "total_revenue": {
      "sum": {
        "field": "revenue"
      }
    },
    "avg_order_value": {
      "avg": {
        "field": "order_value"
      }
    }
  }
}
Stats aggregation – zwraca wszystkie podstawowe statystyki (count, min, max, avg, sum) w jednym zapytaniu. Wydajniejsze niż osobne agregacje dla każdej metryki.

Percentiles – Analiza rozkładu

Szczególnie przydatne w analizie wydajności i SLA:

{
  "aggs": {
    "response_time_percentiles": {
      "percentiles": {
        "field": "response_time",
        "percents": [50, 95, 99, 99.9]
      }
    }
  }
}

Zagnieżdżone Agregacje – Wielowymiarowa Analiza

Prawdziwa moc Elasticsearch agregacji ujawnia się gdy łączymy różne typy w hierarchię:

{
  "aggs": {
    "monthly_sales": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "month"
      },
      "aggs": {
        "by_category": {
          "terms": {
            "field": "category.keyword"
          },
          "aggs": {
            "total_revenue": {
              "sum": {
                "field": "revenue"
              }
            },
            "avg_order_value": {
              "avg": {
                "field": "order_value"
              }
            }
          }
        }
      }
    }
  }
}
Pro tip: Zagnieżdżaj agregacje logicznie – od ogólnego do szczegółowego. Najpierw czas, potem kategoria, na końcu metryki. To zapewnia najlepszą wydajność i czytelność wyników.

Pipeline Aggregations – Zaawansowane Obliczenia

Pipeline aggregations działają na wynikach innych agregacji, pozwalając na zaawansowane obliczenia jak trendy, moving averages czy derivative.

Derivative – Analiza trendów

Oblicza zmianę wartości między bucketami:

{
  "aggs": {
    "monthly_sales": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "month"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "revenue"
          }
        },
        "sales_trend": {
          "derivative": {
            "buckets_path": "total_sales"
          }
        }
      }
    }
  }
}

Moving Average – Wygładzanie trendów

Przydatne do filtrowania szumu w danych czasowych:

{
  "aggs": {
    "daily_orders": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "day"
      },
      "aggs": {
        "order_count": {
          "value_count": {
            "field": "order_id"
          }
        },
        "smoothed_orders": {
          "moving_avg": {
            "buckets_path": "order_count",
            "window": 7,
            "model": "simple"
          }
        }
      }
    }
  }
}

Optymalizacja Wydajności Agregacji

Uwaga: Agregacje na dużych zbiorach danych mogą być zasobożerne. Zawsze testuj wydajność przed wdrożeniem na produkcję.

Najlepsze praktyki wydajnościowe

Doc values: Elasticsearch automatycznie tworzy doc values dla większości pól. To kolumnowa struktura danych zoptymalizowana pod agregacje. Nie wyłączaj bez powodu.
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "timestamp": {
              "gte": "2019-01-01",
              "lte": "2019-12-31"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "filtered_analysis": {
      "terms": {
        "field": "category.keyword",
        "size": 10
      }
    }
  }
}
Pro tip: Używaj filter zamiast query gdy możesz. Filtry nie obliczają score i są cache’owane, co znacznie poprawia wydajność agregacji.

Praktyczne Przypadki Użycia

Dashboard e-commerce

{
  "size": 0,
  "query": {
    "range": {
      "timestamp": {
        "gte": "now-30d"
      }
    }
  },
  "aggs": {
    "daily_revenue": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "day"
      },
      "aggs": {
        "revenue": {
          "sum": {
            "field": "total_amount"
          }
        }
      }
    },
    "top_products": {
      "terms": {
        "field": "product_name.keyword",
        "size": 5
      },
      "aggs": {
        "quantity_sold": {
          "sum": {
            "field": "quantity"
          }
        }
      }
    },
    "conversion_funnel": {
      "filters": {
        "filters": {
          "views": { "term": { "event_type": "product_view" } },
          "cart_adds": { "term": { "event_type": "add_to_cart" } },
          "purchases": { "term": { "event_type": "purchase" } }
        }
      }
    }
  }
}

Analiza logów aplikacji

{
  "aggs": {
    "error_analysis": {
      "filter": {
        "term": {
          "log_level": "ERROR"
        }
      },
      "aggs": {
        "by_service": {
          "terms": {
            "field": "service_name.keyword"
          },
          "aggs": {
            "error_count": {
              "value_count": {
                "field": "timestamp"
              }
            },
            "top_errors": {
              "terms": {
                "field": "error_message.keyword",
                "size": 3
              }
            }
          }
        }
      }
    }
  }
}
Pułapka: Nie używaj agregacji na analyzed text fields bez mappingu. Elasticsearch będzie agregować po tokenach, nie po całych wartościach. Zawsze sprawdź mapping przed napisaniem agregacji.

Integracja z Kibana

Kibana automatycznie tłumaczy wizualizacje na odpowiednie agregacje Elasticsearch. Każdy chart w Kibana to pod spodem jedna lub więcej agregacji:

– **Line/Area charts** → Date histogram + metric aggregations
– **Pie charts** → Terms aggregation
– **Data tables** → Terms + metric aggregations
– **Heatmaps** → Date histogram + terms + metric

Czy mogę używać agregacji z zapytaniami wyszukiwania?

Tak! Agregacje działają na wynikach query. Możesz najpierw przefiltrować dokumenty zapytaniem, a potem agregować tylko te które pasują do kryteriów.

Jak głęboko mogę zagnieżdżać agregacje?

Teoretycznie bez limitu, ale każdy poziom zwiększa złożoność obliczeniową. W praktyce 3-4 poziomy to rozsądny maksyum dla wydajności.

Czy agregacje działają w czasie rzeczywistym?

Tak, agregacje obliczają wyniki na żywo z aktualnych danych. Nie ma potrzeby pre-obliczania jak w tradycyjnych systemach BI.

Co gdy mam za dużo unikalnych wartości w terms aggregation?

Użyj parametru size aby ograniczyć wyniki. Domyślnie Elasticsearch zwraca top 10. Uważaj na high cardinality fields – mogą powodować problemy z pamięcią.

Jak agregacje wpływają na wydajność klastra?

Agregacje wykorzystują CPU i pamięć. Skomplikowane agregacje na dużych zbiorach danych mogą spowolnić klaster. Zawsze monitoruj metryki wydajności i używaj appropriate node roles.

Czy mogę cache’ować wyniki agregacji?

Elasticsearch automatycznie cache’uje niektóre części agregacji. Możesz też użyć frozen indices dla historycznych danych które analizujesz rzadziej.

Jak obsłużyć missing values w agregacjach?

Użyj parametru missing w agregacji aby zdefiniować wartość zastępczą dla dokumentów bez danego pola.

🚀 Zadanie dla Ciebie

Stwórz dashboard analityczny dla e-commerce który pokazuje:

  • Dzienny trend sprzedaży z ostatnich 30 dni
  • Top 5 kategorii produktów według przychodów
  • Średnią wartość zamówienia dla każdej kategorii
  • Conversion rate (stosunek purchases do views) w rozbiciu na urządzenia

Użyj zagnieżdżonych agregacji i sprawdź wydajność na większym zbiorze danych. Bonus: dodaj moving average dla trendu sprzedaży.

Przydatne zasoby:

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry