Elasticsearch: le tipologie di aggregazione

Elasticsearch è un database NoSQL molto utilizzato per sviluppare motori di ricerca grazie alle sue capacità di indicizzare in modo opportuno i testi. Ma non si ferma solo a questo. Grazie alle aggregazioni, Elasticsearch può essere utilizzato per analizzare i dati ed estrarre statistiche da grandi moli di dati. Scopriamo questa sua funzionalità che è alla base di molte visualizzazioni usate da Kibana.

Share

Tempo di lettura: 3 minuti

Negli articoli precedenti, Elasticsearch: uso delle match queryElasticsearch: uso delle term query, Elasticsearch: query compound e Elasticsearch: join e query bonus, abbiamo visto come interrogare i documenti salvati all’interno di un indice di Elasticsearch. Ma Elasticsearch non è solo per la ricerca di informazioni strutturate o di testo non strutturato. Le aggregazioni consentono di sfruttare il potente motore analitico di Elasticsearch per analizzare i dati ed estrarne le statistiche.

I casi d’uso delle aggregazioni variano dall’analisi dei dati in tempo reale per intraprendere un’azione all’utilizzo di Kibana per creare un dashboard di visualizzazione. Infatti, molte visualizzazioni, che abbiamo già visto negli articoli Kibana: esploriamo i datiKibana: costruire la propria dashboard per creare delle dashboard interattive, si basano sull’aggregazione.

Il grande potenziale di Elasticsearch è la possibilità di eseguire aggregazioni su enormi insiemi di dati in pochi millisecondi. Ovviamente, rispetto alle query, le aggregazioni consumano più cicli di CPU e memoria. Pertanto questa tipologia di ricerca viene usata principalmente per la creazione di dashboard o effettuare analisi complesse sui dati.

In questa serie di articoli studieremo, mediante degli esempi, le varie tipologie di aggregazione per capire quali informazioni e statistiche possiamo estrarre. In particolare, in questo articolo introdurremo la sintassi dell’aggregazione e le varie tipologie che poi analizzeremo successivamente.

Aggregazioni sui campi di testo

Per impostazione predefinita, Elasticsearch non supporta le aggregazioni su un campo di tipo testuale. Poiché i campi di testo sono tokenizzati, un’aggregazione su un campo di testo deve invertire il processo di tokenizzazione per tornare alla stringa originale e quindi formulare un’aggregazione basata su di essa. Questa operazione consuma molta memoria e degrada le prestazioni del cluster.

Sebbene sia possibile abilitare le aggregazioni sui campi di testo impostando il parametro fielddata su true nella mappatura, le aggregazioni si basano ancora sulle parole tokenizzate e non sul testo grezzo.

Si consiglia di mantenere una versione grezza del campo di testo come campo di tipo keyword su cui è possibile effettuare aggregazioni. In questo caso, è possibile eseguire aggregazioni sul campo title.raw, invece che sul campo title:

PUT movies
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "fielddata": true,
        "fields": {
          "raw": {
            "type": "keyword"
          }
        }
      }
    }
  }
} 

Struttura generale di aggregazione

La struttura di una query di aggregazione è la seguente:

GET _search
{
  "size": 0,
  "aggs": {
    "NAME": {
      "AGG_TYPE": {}
    }
  }
} 

Se si è interessati solo al risultato dell’aggregazione e non ai risultati della query, si consiglia di impostare la dimensione a 0.

Nella proprietà aggs si può definire un numero qualsiasi di aggregazioni. Ogni aggregazione è definita dal suo nome e da uno dei tipi di aggregazione supportati da Elasticsearch.

Il nome dell’aggregazione aiuta a distinguere le diverse aggregazioni nella risposta. La proprietà AGG_TYPE consente di specificare il tipo di aggregazione.

Aggregazione dei campioni

Questa sezione utilizza i dati di e-commerce e i dati di web log di esempio di Kibana. Per aggiungere i dati di esempio, accedere a Kibana, scegliere Home e Try our sample data. Per gli ordini e-commerce di esempio e i registri web di esempio, scegliere Add data.

Esempio di calcolo della media

Per trovare il valore medio del campo taxful_total_price:

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "avg_taxful_total_price": {
      "avg": {
        "field": "taxful_total_price"
      }
    }
  }
} 

Risposta di esempio

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4675,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "avg_taxful_total_price" : {
      "value" : 75.05542864304813
    }
  }
} 

Il blocco di aggregazione nella risposta mostra il valore medio del campo taxful_total_price.

Tipi di aggregazioni

Esistono tre tipi principali di aggregazioni:

  • Aggregazioni metriche: calcolano metriche come somma, min, max e avg su campi numerici.
  • Aggregazioni a bucket: ordinano i risultati delle query in gruppi basati su alcuni criteri.
  • Aggregazioni di tipo pipeline: trasformano l’output di un’aggregazione in un input per un’altra.

Aggregazioni annidate

Le aggregazioni all’interno delle aggregazioni sono chiamate aggregazioni annidate o sottoaggregazioni. Non tutte le tipologie di aggregazioni permettono di definire delle aggregazioni annidate. Infatti, le aggregazioni metriche producono risultati semplici che non possono essere usate per ulteriori aggregazioni. Diversamente, le aggregazioni a bucket producono gruppi di documenti che possono essere annidati in altre aggregazioni. È possibile eseguire analisi complesse sui dati annidando le aggregazioni di metriche e di bucket all’interno delle aggregazioni di bucket.

Sintassi generale dell’aggregazione annidata

{
  "aggs": {
    "name": {
      "type": {
        "data"
      },
      "aggs": {
        "nested": {
          "type": {
            "data"
          }
        }
      }
    }
  }
} 

La parola chiave aggs interna inizia una nuova aggregazione annidata. La sintassi dell’aggregazione padre e dell’aggregazione annidata è la stessa. Le aggregazioni annidate vengono eseguite nel contesto delle aggregazioni precedenti.

È anche possibile associare le aggregazioni a query di ricerca per restringere gli elementi da analizzare prima dell’aggregazione. Se non si aggiunge una query, Elasticsearch utilizza implicitamente la query match_all.

Vedremo negli articoli successivi alcuni esempi per le varie tipologie di aggregazioni.

More To Explore

Intelligenza artificiale

Sentiment Analysis e Topic Modeling: cosa dicono davvero i tuoi clienti

Hai 200 recensioni, 500 ticket di supporto, 1.000 commenti. Leggerli tutti richiederebbe giorni — e alla fine non saresti neanche sicuro di aver colto i pattern più importanti. Sentiment Analysis e Topic Modeling risolvono esattamente questo: in dieci minuti identifichi il tono emotivo di ogni testo, raggruppi i temi ricorrenti e ottieni una sintesi strategica che la lettura manuale non avrebbe mai prodotto.

Intelligenza artificiale

AI Multimodale: analizza PDF, immagini e documenti con Claude, GPT-4 e Gemini

L’AI non legge più solo testo. Claude riassume un preventivo di 10 pagine in 30 secondi. GPT-4 Vision trascrive i dati da uno screenshot di dashboard in formato tabella pronta all’uso. Gemini 1.5 Pro naviga documenti da 1.000 pagine citando le fonti. Questa guida mostra come funzionano, quando usare quale tool e dove il risparmio di tempo è misurabile — con screenshot reali di sessioni operative.

Una risposta

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Progetta con MongoDB!!!

Acquista il nuovo libro che ti aiuterà a usare correttamente MongoDB per le tue applicazioni. Disponibile ora su Amazon!