Elasticsearch: il motore di ricerca basato su Lucene

In questo articolo vedremo cosa è Elasticsearch, il motore di ricerca basato su Lucene, e su come funziona.

Elasticsearch: cos’è, come funziona e caratteristiche

Elasticsearch: che cosa è

Elasticsearch: il motore di ricerca basato su Lucene, le API di reperimento dati Open Source più veloce e utilizzato per la realizzazione dei motori di ricerca.

Quello che sicuramente sappiamo è che Elasticsearch il motore di ricerca basato su Lucene. Ma se andiamo a chiedere a più colleghi cosa è Elasticsearch vedrete che otterremo sicuramente risposte diverse. Questo perchè Elasticsearch è utilizzato in diversi modi. Inoltre è facile che se poniamo la domanda a sviluppatori senior potrebbero avere difficoltà a rispondere, potremmo ricevere risposte diverse rispetto alla descrizione del prodotto e al suo utilizzo. Questo perchè, come vedremo più avanti nei casi di uso, Elasticsearch potrebbe essere stato utilizzato come “semplice” motore di ricerca o per generare eventi o messaggistica istantanea.

In questo articolo cercheremo di spiegare cosa è Elasticsearch e come potremmo utilizzarlo per le nostre esigenze.

Elasticsearch è un motore di ricerca e analisi open source, RESTful, distribuito basato su Apache Lucene. Dalla sua uscita nel 2010, Elasticsearch è diventato rapidamente il motore di ricerca più popolare ed è comunemente usato per i casi di analisi dei log, ricerca full-text, intelligence di sicurezza, analisi di business e intelligence operativa.

La seguente citazione potrebbe essere uo dei tanti modi per definire correttamente Elasticsearch:

Elasticsearch è un motore di ricerca open source, ampiamente distribuibile, facilmente scalabile e di livello aziendale. Accessibile tramite un’API ampia ed elaborata, Elasticsearch può effettuare ricerche estremamente veloci a supporto delle applicazioni di rilevamento dei dati.

Elasticsearch: come funziona?

Puoi inviare dati sotto forma di documenti JSON ad Elasticsearch utilizzando l’API o gli strumenti di acquisizione come Logstash, che andreamo a vedere nel prossimo articolo, e Amazon Kinesis Firehose. Elasticsearch memorizza automaticamente il documento originale e aggiunge una chiave ricercabile nell’indice del cluster. È quindi possibile cercare e recuperare il documento utilizzando le API di Elasticsearch. E’ possibile utilizzare anche software come Kibana, che uno strumento di visualizzazione open source, utileper visualizzare i dati salvati e creare dashboard interattive con cui è possibile creare report e statistiche.

Elasticsearch: Ricerca rapida e incisiva su grandi volumi di dati

I sistemi di gestione di database SQL tradizionali non sono realmente progettati per effettuare ricerche full-text e di certo, come ben sappiamo, non funzionano bene con dati grezzi non strutturati che non risiedono nel database. Se in un query tradizionale otteniamo il risultato in 10 secondi, quella stessa query, eseguita in ambiente Elasticsearch produce lo stesso risultata in meno di 10 millisecondi.

Il linguaggio che ci consente di eseguire comandi specifici su Elasticsearch si chiama Query DSL. Una query esamina uno o più valori target e calcola ciascuno degli elementi nei risultati in base a quanto si avvicinano al focus della query. Gli operatori di query consentono di ottimizzare query semplici o complesse che spesso restituiscono risultati da insiemi di dati di grandi dimensioni in pochi millisecondi. Il design di Elasticsearch è molto più semplice e molto più snello di un database limitato da schemi, tabelle, campi, righe e colonne.

Elasticsearch: Indicizzazione dei documenti nel repository

Elasticsearch durante un’operazione di indicizzazione, converte i dati grezzi come file di registro o file di messaggi in documenti interni e li memorizza in una struttura di dati di base simile a un oggetto JSON. Ogni documento è un semplice insieme di chiavi e valori correlati: le chiavi sono stringhe e i valori sono uno dei numerosi tipi di dati: stringhe, numeri, date o elenchi.

Aggiungere documenti a Elasticsearch è facile ed è facile da automatizzare. È sufficiente eseguire un POST HTTP che trasmette il documento come un semplice oggetto JSON. Le ricerche vengono eseguite anche con JSON: basta inviare la query in un HTTP GET con un corpo JSON. L’API RESTful semplifica il recupero, l’invio e la verifica dei dati direttamente dalla riga di comando. Anche se si sta sviluppando un client utilizzando Python o Ruby, molti sviluppatori utilizzano lo strumento cURL per il debug e lo sviluppo con Elasticsearch.

Logstash elasticsearch kibana

Elasticsearch: Archiviazione dei documenti denormalizzata: accesso rapido e diretto ai dati

È importante ricordare che Elasticsearch non è un database relazionale, quindi i concetti DBMS di solito non vengono applicati. Il concetto più importante che è necessario mettere da parte quando si arriva da database convenzionali è la normalizzazione. Native Elasticsearch non consente join o sottoquery, pertanto la denormalizzazione dei dati è essenziale.

Elasticsearch memorizza in genere un documento una volta per ciascun repository in cui risiede. Anche se questo è controintuitivo dal punto di vista di un DBMS convenzionale, è ottimale per Elasticsearch. Le ricerche full-text saranno estremamente veloci perché i documenti vengono archiviati in prossimità dei metadati corrispondenti nell’indice. Questo design riduce notevolmente il numero di letture dei dati e Elasticsearch limita il tasso di crescita dell’indice tenendolo sempre compresso.

Elasticsearch: Ampiamente distribuibile e altamente scalabile

Elasticsearch può scalare fino a migliaia di server e ospitare petabyte di dati. La sua enorme capacità deriva direttamente dalla sua elaborata architettura distribuita. Eppure l’utente Elasticsearch normalmente è inconsapevole di quasi tutta l’automazione e la complessità che supporta questo tipo di design distribuito.

Se dovessimo eseguire la maggior parte degli esempi in uno qualsiasi dei nostri tutorial o quelli trovati nella documentazione Elastic — su un singolo nodo o un cluster di 100 nodi — tutto funzionerebbe esattamente allo stesso modo.

In Elasticsearch, queste operazioni, che consentono di avere sempre le stesse prestazioni, sono delicate e spesso intense è avvengono automaticamente senza che ce ne rendiamo conto. Possiamo quindi dire che Elasticsearch:

  • partiziona i documenti attraverso una disposizione di frammenti distinti denominati contenitori;
  • utilizza cluster multi-nodo e i documenti sono distribuiti, frammentati e risiedono su tutti i nodi esistenti;
  • frammenta in modo bilanciatao su tutti i nodi di un cluster per gestire in modo uniforme l’indicizzazione e il carico di ricerca;
  • duplica ogni frammento per fornire ridondanza e failover dei dati;
  • instrada ogni richiesta su qualsiasi nodo del cluster a nodi specifici contenenti i dati specifici necessari;
  • aggiunge e integra nuovi nodi senza soluzione di continuità quando si rileva la necessità di aumentare le dimensioni del cluster;
  • ridistribuisce i frammenti per il ripristino automatico dalla perdita di un nodo.

Elasticsearch: funziona come un database NOSQL

Nell’articolo in cui mettevamo a confronto Cassandra vs MongoDB vi ho spiegato cosa è un database NOSQL. Elasticsearch fa parte di questa famiglia. Non utilizza il linguaggio SQL standard ma Query DSL.

Elasticsearch: informazioni sulla sua struttura

Per comprendere meglio Elasticsearch e il suo utilizzo è utile avere una comprensione generale dei principali componenti di backend.

I Nodi (Nodes)

Un nodo è un singolo server che fa parte di un cluster, memorizza i nostri dati e partecipa alle funzionalità di indicizzazione e ricerca del cluster. Proprio come un cluster, un nodo è identificato da un nome che per impostazione predefinita è un UUID (Universal Universal Unique Identifier) ​​assegnato al nodo all’avvio. Possiamo modificare i nomi dei nodi predefiniti nel caso lo desiderassimo.

I Cluster

Un cluster è una raccolta di uno o più nodi che tengono insieme tutti i tuoi dati e forniscono funzionalità di indicizzazione e ricerca federate. Possono esserci N nodi con lo stesso nome cluster. Elasticsearch funziona in un ambiente distribuito: con la replica tra cluster, un cluster secondario può entrare in azione come backup a caldo senza la necessità di restartare Elasticsearch.

Gli Indici (Index)

L’indice è una raccolta di documenti con caratteristiche simili. Ad esempio, possiamo avere un indice per un cliente specifico, un altro per informazioni sul prodotto e un altro per una diversa tipologia di dati. Un indice è identificato da un nome univoco che fa riferimento all’indice quando si eseguono operazioni di ricerca, aggiornamento ed eliminazione dell’indicizzazione. In un singolo cluster, possiamo definire tutti gli indici che vogliamo. L’indice è simile al database in un RDBMS.

I Documenti (Document)

Un documento è un’unità di base di informazioni che può essere indicizzata. Ad esempio, puoi avere un indice sul tuo prodotto e quindi un documento per un singolo cliente. Questo documento è espresso in JSON (JavaScript Object Notation) che è un formato di scambio di dati Internet onnipresente. Analogia con un singolo raw in un DB. All’interno di un indice, è possibile archiviare tutti i documenti desiderati, in modo che nello stesso indice sia possibile avere un documento per un singolo prodotto e un altro per un singolo ordine.

Shards and Replicas

Elasticsearch offre la possibilità di suddividere il proprio indice in più pezzi chiamati frammenti (Shards). Quando crei un indice, puoi semplicemente definire il numero di frammenti che desideri. Ogni frammento è di per sé un “indice” completamente funzionale e indipendente che può essere ospitato su qualsiasi nodo del cluster. I frammenti sono importanti perché consentono di dividere orizzontalmente il volume di dati, potenzialmente anche in più operazioni di paralizzazione di nodi aumentando così le prestazioni. I frammenti possono anche essere utilizzati effettuando più copie dell’indice in frammenti di repliche, che in ambienti cloud potrebbero essere utili per fornire alta disponibilità.

Elasticsearch, Logstash e Kibana

Sebbene il motore di ricerca sia alla base, gli utenti hanno iniziato a utilizzare Elasticsearch per i log. Elasticsearch, Logstash e Kibana sono i componenti principali dello stack Elastic e sono conosciuti come ELK.

Kibana

Kibana ti consente di visualizzare i tuoi dati Elasticsearch e di navigare nello Stack Elastic. Puoi selezionare il modo di dare forma ai tuoi dati iniziando con una domanda per scoprire dove ti porterà la visualizzazione interattiva. Puoi iniziare con i grafici classici (istogrammi, grafici a linee, grafici a torta, scatti di sole e così via) o progettare la tua visualizzazione e aggiungere i dati geografici su qualsiasi mappa. È inoltre possibile eseguire analisi avanzate di serie storiche, trovare relazioni visive nei dati ed esplorare anomalie con le funzionalità di apprendimento automatico. Per maggiori dettagli dai un’occhiata alla pagina ufficiale.

Logstash

Logstash è una pipeline di elaborazione dei dati lato server open source che ingerisce simultaneamente dati da una moltitudine di fonti, li trasforma e quindi li invia per la raccolta. I dati sono spesso sparsi o sporchi su molti sistemi in molti formati. Su Logstash è possibile importare registri, metriche, applicazioni Web, archivi dati e vari servizi AWS, il tutto in modalità streaming continuo. Può essere utilizzato con diversi moduli come Netflow, per ottenere informazioni dettagliate sul traffico di rete. Trasforma e prepara dinamicamente i dati indipendentemente dal formato identificando i campi con nome per costruire la struttura e trasformandoli in modo da convergere su un formato comune. È possibile utilizzare la funzione di monitoraggio in X-Pack per ottenere una visibilità completa delle metriche sulla distribuzione di Logstash. Nella dashboard panoramica, puoi vedere tutti gli eventi ricevuti e inviati da Logstash, oltre a informazioni sull’utilizzo della memoria e sul tempo di attività. Quindi è possibile eseguire il drill down per visualizzare le statistiche relative a un nodo specifico. Maggiori dettagli sulla pagina ufficiale.

Elasticsearch: casi di uso

Elasticsearch può essere utilizzato in vari modi che è difficile indicarne tutti quelli interessanti. Per semplicità, abbiamo selezionato tre categorie principali e tre casi d’uso di aziende principali, se vuoi immergerti di più puoi dare un’occhiata alla loro pagina dei casi d’uso.

  • Main Data Store: crea catalogo ricercabile, archivio documenti e sistema di registrazione;
  • Tecnologie Complementari: aggiungere funzionalità di visualizzazione a SQL, mongoDB, indicizzare cast e cercare in Hadoop, oppure aggiungere elaborazione e archiviazione a kafka;
  • Tecnologia Aggiuntiva: nel caso in cui tu abbia già effettuato l’accesso a Elasticsearch, potresti voler aggiungere funzionalità di metrica, monitoraggio e analisi.

Netflix: Come utilizza Elasticsearch

Il sistema di messaggistica Netflix dietro le quinte usa Elasticsearch. Il sistema di messaggistica è suddiviso nelle seguenti categorie:

  • Il messaggio che ricevi quando ti iscrivi al servizio;
  • Una volta che le persone si sono registrate, ricevono messaggi sui nuovi contenuti disponibili sulla piattaforma o il rilascio di nuove funzionalità;
  • Una volta che sanno di più su di te attraverso gli algoritmi di Machine Learning, inviano messaggi più coinvolgenti e personalizzati su ciò che ti potrebbe piacere o piacere guardare;
  • Nel caso in cui decidessi di abbandonare il servizio ti diranno come tornare.

Tinder: Come utilizza Elasticsearch

Questo è un esempio di collaborazione reciproca tra una grande azienda tecnica e la comunità Elasticsearch. Tinder al suo interno è un motore di ricerca. Le query di ricerca sono complesse con eventi a doppia cifra, centinaia di paesi e oltre 50 lingue. La maggior parte delle interazioni degli utenti attiva una query Elasticsearch. Esistono diversi modi per interagire con Tinder in base alle posizioni. Ad esempio in Asia lo usano anche come scambio linguistico o per cercare una guida turistica. per questo motivo le query in Tinder sono molto complesse.

Devono essere:

  • Personalizzate: Anche gli algoritmi di Machine Learning sono utilizzati in questo contesto;
  • Basate sulla località: per trovare una corrispondenza in base a dove ti trovi in ​​un determinato momento;
  • Bidirezionali: per sapere quali utenti scorreranno l’uno sull’altro, il che significa sostanzialmente una corrispondenza;
  • Realtime: L’intera interazione deve avvenire entro millisecondi da una grande quantità di utenti e con molte variabili associate per ciascuno di essi.

Elasticsearch: Conclusioni

Elasticsearch è un motore di ricerca distribuito, RESTful e di analisi in grado di risolvere un’ampia varietà di problemi. Molte aziende stanno passando ad esso e integrandolo nella loro attuale infrastruttura di backend perchè:

  • Permette di ridurre i dati utilizzando l’aggregazione e dare un senso a miliardi di righe di registro;
  • Combina diversi tipi di ricerche: strutturata, non strutturata, Geo, ricerca di applicazioni, analisi della sicurezza, metriche e registrazione;
  • È davvero veloce e può funzionare allo stesso modo sul tuo laptop con un singolo nodo o su un cluster con centinaia di server, rendendo molto semplice la prototipazione;
  • Utilizza API RESTful standard e JSON. La community ha inoltre creato e mantiene client in molti linguaggi come Java, Python, .NET, SQL, Perl, PHP ecc;
  • È possibile utilizzare le funzionalità di ricerca e analisi in tempo reale di Elasticsearch per lavorare sui big data utilizzando il connettore Elasticsearch-Hadoop (ES-Hadoop);
  • Software come Kibana e Logstash ti consentono di dare un senso ai tuoi dati in modo molto semplice e immediato utilizzando grafici ed eseguendo ricerche granulari.

In questo articolo abbiamo solo graffiato la superficie del potere e dei casi d’uso di Elasticsearch e la varietà di sfide aziendali che è in grado di risolvere. Se sei interessato a saperne di più o a testarlo, dai un’occhiata alla pagina ufficiale del prodotto e ai tutorial utili per un rapido avvio.

Potrebbero interessarti anche...