Elasticsearch è uno strumento potente per l'archiviazione e la ricerca di dati, ma è fondamentale comprendere come gestire l'eliminazione dei documenti quando necessario. In questa sezione, esploreremo il processo di cancellazione di un documento da un indice di Elasticsearch, utilizzando sia approcci diretti che ottimizzati per scenari di massa.

Quando un documento viene eliminato in Elasticsearch, non viene rimosso immediatamente dall'indice. Invece, viene segnato come eliminato. Questa strategia consente di ottimizzare le risorse evitando operazioni costose, come la riorganizzazione dei segmenti dell'indice. I documenti rimangono nell'indice fino a quando non vengono fisicamente rimossi attraverso un processo di fusione durante le attività di ottimizzazione di routine. Questo approccio, sebbene apparentemente semplice, consente di gestire le eliminazioni in modo molto più efficiente.

Per eseguire l'eliminazione, iniziamo con un semplice esempio in Python. Supponiamo di avere un file chiamato tmp.txt, che contiene l'ID del documento da eliminare. Dopo aver letto questo ID, possiamo verificare se il documento esiste effettivamente nell'indice e procedere con la cancellazione utilizzando l'API di Elasticsearch. Il codice di esempio potrebbe apparire come segue:

python
with open('tmp.txt', 'r') as file: document_id = file.read() if document_id != '': if es.exists(index=index_name, id=document_id): # elimina il documento in Elasticsearch response = es.delete(index=index_name, id=document_id) print(f"Status della cancellazione: {response['result']}")

Una volta eseguito il codice, dovresti vedere l'output che conferma lo stato dell'eliminazione. Tuttavia, per una verifica ulteriore, puoi eseguire una nuova ricerca nell'indice per vedere se il documento è stato effettivamente rimosso.

bash
GET movies/_search

In questo caso, il numero totale di "hit" sarà 0, a conferma che il documento è stato eliminato con successo. Ma come funziona esattamente questo processo? Il meccanismo di eliminazione in Elasticsearch è progettato per essere il più efficiente possibile. Anziché eseguire una riorganizzazione immediata dell'indice, i documenti vengono semplicemente contrassegnati come eliminati, riducendo il carico sulle risorse del sistema.

Nel caso in cui si desideri eliminare più documenti contemporaneamente, l'uso dell'API Delete By Query è una scelta molto più adatta. Questa API permette di specificare una query per eliminare tutti i documenti che soddisfano determinati criteri. Per esempio, se vogliamo eliminare tutti i film di genere "commedia", possiamo eseguire la seguente richiesta:

json
POST /movies/_delete_by_query
{ "query": { "match": { "genre": "comedy" } } }

Questa query eliminerà tutti i documenti corrispondenti al genere "comedy" nell'indice movies. Quando si devono eliminare grandi volumi di dati, è consigliabile utilizzare il parametro slices per migliorare le prestazioni. Questo parametro suddivide l'eliminazione in operazioni parallele più piccole, bilanciando meglio il carico e riducendo il rischio di rallentamenti o errori nel cluster Elasticsearch.

Avere a disposizione una gestione ottimizzata delle eliminazioni consente di risparmiare tempo e risorse preziose, rendendo il sistema più reattivo e meno vulnerabile a sovraccarichi. L'utilizzo di tecniche come la divisione in slice non solo aumenta l'efficienza del processo, ma permette anche di evitare che operazioni di grande portata influenzino negativamente le prestazioni complessive del sistema.

L'approccio pratico alla cancellazione dei dati non finisce qui. È possibile approfondire ulteriormente la gestione dei dati in Elasticsearch utilizzando tecniche avanzate di indicizzazione e analisi. Per esempio, configurare un analizzatore specifico per il trattamento dei testi può migliorare significativamente la qualità delle ricerche, ottimizzando il modo in cui i dati vengono trattati prima di essere memorizzati nell'indice. Gli analizzatori di Elasticsearch gestiscono funzioni come la tokenizzazione e la normalizzazione dei dati, garantendo che i contenuti vengano analizzati correttamente prima di essere archiviati.

In questo contesto, uno degli analizzatori più comuni è l'analizzatore "standard" con filtro per le parole di stop in inglese. Un'implementazione di esempio potrebbe configurare l'indice per utilizzare un analizzatore che escluda parole comuni (come articoli e preposizioni) dalla ricerca, migliorando così l'efficienza e la precisione.

python
index_settings = { "analysis": { "analyzer": { "standard_with_english_stopwords": { "type": "standard", "stopwords": "_english_" } } } }

Una volta configurato l'indice con queste impostazioni, sarà possibile effettuare ricerche più precise ed efficienti. Testare l'efficacia dell'analizzatore è semplice; basta utilizzare l'endpoint _analyze di Elasticsearch per verificare come un dato testo viene elaborato dal sistema.

Questi strumenti offrono un controllo avanzato sui dati e migliorano le prestazioni generali di Elasticsearch, consentendo agli sviluppatori di adattare il sistema alle specifiche necessità delle loro applicazioni.

Come visualizzare i dati del traffico globale utilizzando Kibana

Iniziamo con la creazione di una visualizzazione avanzata dei dati, sfruttando le capacità di Kibana Lens per esplorare e analizzare la distribuzione globale dello stato del traffico. Una delle novità introdotte nella versione 8 di Elastic Stack è la possibilità di creare un "waffle chart", un tipo di grafico molto utile per rappresentare le proporzioni, come nel caso della distribuzione dello stato del traffico. Seguendo questi semplici passaggi, è possibile costruire una visualizzazione efficace che offre una panoramica chiara e comprensibile della situazione.

Per prima cosa, accediamo alla libreria delle visualizzazioni di Kibana, navigando su Analytics e selezionando "Visualize Library". Da qui, clicchiamo su "Create visualization" e scegliamo Lens. È importante selezionare il data view appropriato, in questo caso, il dataset "metrics-rennes_traffic-raw". Una volta che abbiamo selezionato questo data view, possiamo procedere scegliendo il tipo di grafico "Waffle" dalla lista disponibile.

Successivamente, dobbiamo selezionare il campo "traffic_status" dalla barra laterale sinistra, per visualizzare la distribuzione dei vari stati di traffico. Nel dataset di traffico di Rennes, ad esempio, possiamo osservare quattro diversi stati di traffico. Trasciniamo il campo "traffic_status" nell'area di lavoro centrale e, nella sezione "Group by" a destra, impostiamo il numero di valori su 4, per allineare la visualizzazione ai quattro stati distinti presenti nel nostro dataset. Il "Count of records" rappresenterà la frequenza con cui ciascuno stato di traffico si presenta in diverse località. Per rendere più chiara la visualizzazione, aggiorniamo l'etichetta, sostituendo "Count of records" con "Traffic status distribution", che meglio descrive la distribuzione osservata.

Una volta completato, possiamo cliccare su "Save" per salvare il grafico nella libreria, assegnando un titolo come "[Rennes Traffic] Traffic status waffle" e aggiungendo il tag "cookbook". Questo tipo di visualizzazione consente di ottenere una rappresentazione semplice e immediata dei vari stati del traffico.

Un altro tipo di visualizzazione che possiamo creare è il "donut chart" con sotto-categorie, particolarmente utile per comprendere come il tipo di strada (definito dalla velocità massima consentita) influisca sulla distribuzione dello stato del traffico. Per creare questo grafico, selezioniamo sempre Lens e scegliamo il dataset "metrics-rennes_traffic-raw". Dopodiché, selezioniamo "Donut" come tipo di grafico e trasciniamo il campo "traffic_status" nell'area di lavoro. A questo punto, possiamo configurare il grafico per visualizzare i "Top 4 values" di "traffic_status", per poi aggiungere "max_speed" nella sezione "Slice by". Così facendo, otteniamo un grafico a ciambella in cui l'anello interno rappresenta la percentuale di ciascuno stato di traffico, mentre l'anello esterno suddivide ciascun stato di traffico in categorie di tipo di strada.

Per personalizzare ulteriormente l’aspetto di questo grafico, possiamo regolare il numero di decimali nei valori percentuali e, se necessario, modificare la granularità dei dati visualizzati nei "slices" di "max_speed". Dopo aver effettuato queste modifiche, possiamo salvare il grafico con il titolo "[Rennes Traffic] Traffic status by road type" e aggiungere il tag "cookbook".

Un’altra visualizzazione interessante che possiamo costruire riguarda la comparazione tra la velocità media e lo stato del traffico. Questo tipo di visualizzazione multilivello è particolarmente utile per analizzare l’impatto che i vari stati di traffico hanno sulla velocità media globale della città. Per fare ciò, selezioniamo un grafico a barre verticali percentuali, impostando come dimensioni il "traffic_status" e successivamente aggiungiamo un nuovo livello per confrontare lo stato del traffico con la velocità media globale. Qui, aggiungeremo una linea che rappresenta la velocità media delle vetture, per capire come questa varia al variare dello stato del traffico.

Infine, una visualizzazione avanzata che può risultare particolarmente utile è quella che confronta la velocità media con la gerarchia delle strade, utilizzando il nuovo tipo di visualizzazione "Metric", introdotto in Elastic 8. Questo grafico consente di visualizzare più metriche in una griglia, organizzata in base alla gerarchia delle strade. Per costruirlo, selezioniamo "Metric" come tipo di grafico, aggiungiamo "average_vehicle_speed" come metrica principale, e suddividiamo i dati per "hierarchie". In questo modo, possiamo visualizzare le velocità medie per ogni tipo di strada e confrontarle con la velocità massima autorizzata, sempre all’interno di un’unica visualizzazione. Questa combinazione di dati permette di ottenere una visione complessa, ma al tempo stesso chiara, della situazione del traffico in relazione alla struttura stradale della città.

Queste tecniche di visualizzazione non solo migliorano l'analisi dei dati, ma consentono anche di prendere decisioni più informate e strategiche, offrendo una comprensione approfondita di come lo stato del traffico e le condizioni stradali influiscano sul flusso veicolare complessivo. La possibilità di creare visualizzazioni multiple e multilivello, di confrontare diversi aspetti del traffico e di personalizzare l’aspetto dei grafici, rappresenta uno strumento potente per chiunque desideri analizzare e ottimizzare i flussi di traffico in tempo reale.