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

Reading time: 3 minutes

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

Elasticsearch

Elasticsearch: aggregazioni a bucket [parte 1]

Con le aggregazioni a bucket di Elasticsearch possiamo creare gruppi di documenti. In questo articolo ci concentreremo principalmente sulle aggregazioni basate sui campi di tipo keyword presenti negli indici. Utilizzeremo diversi esempi per capire le principali differenze tra le funzioni di aggregazione disponibili.

Elasticsearch

Elasticsearch: aggregazioni metriche

Oltre alla ricerca testuale, Elasticsearch permette di effettuare analisi sui dati mediante le aggregazioni. Tra le varie tipologie di aggregazione disponibili quelle metriche sono orientate proprio a calcolare statistiche su uno o più campi. Mediante degli esempi vedremo quali informazioni possiamo estrarre con questa tipologia di aggregazione.

Una risposta

Lascia un commento

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

Design with MongoDB

Design with MongoDB!!!

Buy the new book that will help you to use MongoDB correctly for your applications. Available now on Amazon!