
Nei miei precedenti articoli (qui il primo e il secondo), ho mostrato come utilizzare ElasticSearch come motore di ricerca full-text in un e-commerce del settore tecnologico, visto alcune configurazioni avanzate e realizzato un indice products
su cui sono stati salvati tutti i prodotti.
A fini dimostrativi, abbiamo utilizzato la libreria Bogus per la generazione dinamica di prodotti e la libreria NEST per la CRUD sull’indice di ElasticSearch.
La nostra classe di modello Product è così definita:
public class Product
{
public int Id { get; set; }
public string Ean { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Brand Brand { get; set; }
public Category Category { get; set; }
public Store Store { get; set; }
public decimal Price { get; set; }
public string Currency { get; set; }
public int Quantity { get; set; }
public float Rating { get; set; }
public DateTime ReleaseDate { get; set; }
public string Image { get; set; }
public List<review> Reviews { get; set; }
}
dove le classi Brand, Category, Store, Review e User sono rispettivamente:
public class Brand
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public class Store
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public class Review
{
public int Id { get; set; }
public short Rating { get; set; }
public string Description { get; set; }
public User User { get; set; }
}
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string IPAddress { get; set; }
public GeoIp GeoIp { get; set; }
}
GeoIP è una classe della libreria NEST utilizzata per i riferimenti geografici.
Come step successivo, mostriamo come creare una dashboard su cui possano essere visualizzate in maniera efficace i prodotti e le ricerche effettuate su di essi, al fine di elaborare statistiche più o meno avanzate.
Piuttosto che sviluppare una soluzione custom con determinati effort in termini di tempo, abbiamo deciso di utilizzare Kibana, un’applicazione front end che fa parte dello stack di ElasticSearch e che ci fornisce la possibilità di visualizzare i dati e le ricerche per tutti i dati indicizzati, oltre che tracciare graficamente il carico delle query.
Kibana può anche essere utilizzata per il monitoraggio, la gestione e la sicurezza dello stesso stack.

Per l’installazione e la configurazione, basta andare sulla pagina https://www.elastic.co/downloads/kibana, dove possiamo trovare gli installer per tutte le piattaforme, e scaricare quello adatto alle nostre esigenze.
Una volta scaricato e decompresso in una cartella di riferimento, nel nostro caso C:\ElasticSearch\Kibana, apriamo il file config/kibana.yml e settiamo il parametro elasticsearch.hosts affinchè punti alla nostra istanza di ElasticSearch (per le versioni locali, ricordiamo che è http://localhost:9200):
elasticsearch.hosts: ["http://localhost:9200"]
Eseguiamo bin/kibana.bat e apriamo da browser la pagina http://localhost:5601. La pagina che visualizziamo è questa:

L’interfaccia di Kibana è divisa in sezioni.
Nella versione open source sono disponibili: Discover (esplora interattivamente i dati), Visualize (analizza i dati in grafici, tabelle, tag), Dashboards (crea viste complesse con i dati), Canvas (crea documenti), Maps (analizza i dati georeferenziati), Dev Tools (fornisce strumenti per elaborare ed analizzare le query), e Management (gestione di indici e cluster).
È possibile installare, inoltre, il plugin X-Pack per utilizzare le sezioni Graph and Monitoring.
Andiamo nella sezione Management -> Elasticsearch -> Index Management per verificare che gli indici Elasticsearch siano stati rilevati correttamente:

Il nostro indice products
, è presente, e possiamo verificarne il mapping e la corrispondenza col nostro modello dei dati:

Per creare un indice Kibana, basta andare nella sezione Management -> Kibana -> Index Patterns e digitare un testo che consenta di collegare il nuovo indice a uno o più indici di ElasticSearch.
Nel nostro caso, digitiamo products
, così da creare il nostro indice Kibana.

Una volta creato l’indice, nella sezione Discover è possibile filtrare i dati per data, per uno o più campi:

Tramite la barra di ricerca, possiamo effettuare query tra i prodotti utilizzando il linguaggio KQL (Kibana Query language), che consente in maniera semplice di effettuare query utilizzando anche l’autocomplete. Ad esempio, potremmo digitare:
category.name : Games AND rating > 0.5
per conoscere tutti i prodotti della categoria Games che hanno un rating superiore a 0.5.
Per visualizzare solo alcuni campi, basta aggiungerli a Selected fields, in modo da avere una vista customizzata.
Una volta aggiunto l’indice e verificato il corretto funzionamento delle query su di esso, possiamo creare nuove visualizzazioni di dati.
Le visualizzazioni consistono in grafici di vario tipo (a barre, torte), tabelle, indicatori, metriche, tag cloud e, naturalmente, supportano le aggregazioni dei dati.
Nella sezione Visualize possiamo creare una nuova visualizzazione dei dati sotto forma di grafici di vario tipo.

Creiamo, ai fini statistici, alcuni grafici dei prodotti raggruppati per categoria, brand, utilizzando dei semplici grafici a barre verticali. Otterremo risultati simili alla foto seguente

È possibile aggiungere dei filtri a questa visualizzazione. Ad esempio, nel nostro caso vogliamo vedere solo prodotti disponibili nello store, e digitiamo quantity > 0
nella barra dei filtri. Clicchiamo su Save e salviamo la nostra visualizzazione.
Un’altra utile visualizzazione è quella dei prodotti per fasce di prezzo. In questo caso definiamo dei bucket sul campo price e li utilizziamo per un grafico a torta. Dividiamo i prodotti per le seguenti fasce di prezzo:
0 50
50 100
100 200
200 400
400 800
800
Il risultato è simile al seguente:

Possiamo aggiungere dei sub-bucket per avere dati aggregati ed una visualizzazione innestata.
Per visualizzare contenuti georeferenziati vengono utilizzate le Elastic Maps, che sono mappe multilayer accessibili nella sezione Maps.
Cliccando su Add layer, possiamo aggiungere dati dal nostro indice, specificando quale campo contiene informazioni geografiche (nel nostro caso geoIp.location
).

Una volta create le visualizzazioni, passiamo alla nostra prima Dashboard, ovvero un insieme di visualizzazioni, ricerche e mappe, solitamente in tempo reale, che fornisce informazioni di alto livello sui dati dell’indice.
Nella sezione Dashboard clicchiamo su Create a new dashboard. Clicchiamo su Add e inseriamo le visualizzazioni appena create:

Le aggiungiamo tutte e le disponiamo sulla dashboard. Il risultato finale è simile al seguente:

Le dashboard possono essere filtrate tramite query KQL, e la visualizzazione rimane sempre dinamica. È possibile inoltre condividerle ed integrarle all’interno delle nostre Web application, tramite iframe. Se clicchiamo su Share -> Copy Iframe Code otterremo un link da copiare:
<iframe src="http://localhost:5601/app/kibana#/dashboard?embed=true" height="600" width="800"></iframe>
Un’altra interessante funzionalità di Kibana è Canvas, uno strumento per la visualizzazione e la presentazione dei dati che, come la Dashboard, mostra dati in tempo reale e li combina con colori, immagini e testo per creare viste dinamiche.
Nella sezione Canvas, clicchiamo su Create workpad e iniziamo ad aggiungere le metriche. Nel nostro caso, inseriamo metriche per i prodotti e gli articoli disponibili, i brand e le categorie presenti, un grafico a torta per la coppia brand-categoria e una media dei prezzi degli articoli per brand.

Una volta creato il workpad può essere condiviso come file JSON o scaricato come report PDF.
Altre interessanti funzionalità sono:
- Machine Learning: consente di verificare anomalie nei dati e creare nuovi indici con i dati normalizzati;
- Graph: consente la visualizzazione delle connessioni tra gli oggetti dell’indice;
- Logs: serve a visualizzare e gestire i dati di log delle nostre applicazioni, ed eventualmente verificarne le anomalie anche in tempo reale:
- API REST: per comunicare tramite HTTP con l’engine di Kibana e gestire le nostre dashboard;
- APM: consente di monitorare servizi, applicazioni e relative performance in tempo reale;
- Dev Tools: un insieme di strumenti per interagire con i dati, tra cui la console e un profiler delle ricerche.
Conclusioni
In questo articolo abbiamo visto come utilizzare Kibana per elaborare, gestire e ottenere il meglio da ElasticSearch. Mi auguro di aver suscitato il vostro interesse per l’argomento.
Il progetto di esempio col codice utilizzato è disponibile qui: https://github.com/enricobencivenga/ProductElasticSearchAdvanced.
Alla prossima!