In un mondo pieno di Informazioni, bisogna implementare un ottimo meccanismo di ricerca…da Lucene ad Elastichsearch

A dispetto del suo logo
lucene_0

Lucene è diventato, nel corso degli anni, lo standard de-facto nell’indicizzazione di dati orientati al testo, infatti viene utilizzato da diverse soluzioni per la ricerca, da Hibernate Search ed Elasticsearch. Con questo articolo vorrei cominciare una serie di articoli che ci porteranno ad esplorare le potenzialità di questi strumenti quantomai utili per effettuale le ricerche nella enorme mole di informazioni che abbiamo la necessità di gestire e soprattutto recuperare velocemente.

Lucene è una libreria scritta in Java il cui core è di circa 1Mb e non ha dipendenze con altre librerie. L’unico scopo di Lucene è fare ricerche, quindi tutti gli altri aspetti legati alle ricerche (runtime server, amministrazione, filtraggio documenti, ecc…), sono da implementare a seconda dell’applicazione che si sta sviluppando.

Fondamentalmente Lucene è una scalabile e performante libreria per il recupero delle Informazioni (IR), in riferimento alla ricerca dei documenti, le informazioni associate ad esso o i suoi metadati. E’ possibile aggiungere le funzionalità di ricerca alla nostra applicazione in modo semplice.
Oltre al jar che contiene le funzionalità base di Lucene, esiste una serie di estensioni che forniscono delle funzionalità aggiuntive, a volte molto utili. Alcune di loro sono, per esempio, lo spellchecker o il modulo per l’highlight.

Cosa può fare Lucene?

Lucene ci permette di porre l’attenzione sull’implementazione della nostra logica di business nascondendo la complessità dell’indicizzazione e ricerca attraverso delle semplici API .
Lucene, quindi, aggiunge capacità di ricerca nelle nostre applicazioni, infatti Lucene può indicizzare e rendere “ricercabile” ogni dato da cui possiamo estrarre del testo. Lucene non si preoccupa della sorgente dei dati, il loro formato e nemmeno della loro lingua, l’unico vincolo è la necessità di estrarre del testo da essi.


Un pò di Storia

Lucene è stato scritto da Doug Cutting che lo rese disponibile per il download nella sua pagina sul sitoSourceForge. Nel settemre 2001 è diventato un progetto della Apache Software Foundation e divenne il suo progetto di punta nel Febbraio 2005.


Lucene ed i componenti di una applicazione di ricerca

searchprocess

La prima parte di ogni motore di ricerca è l’indicizzazione che rappresenta l’operazione di processamento dei dati iniziali in una efficiente ricerca incrociata dei riferimenti in grado di facilitare e velocizzare le ricerche.

Componenti per l’indicizzazione

Per poter effettuare la ricerca all’interno di una grossa mole di documenti, invece di prevedere lo scanning sequenziale dei documenti alla ricerca dei termini ricercati. è preferibile passare attraverso un’operazione di indicizzazione che crea quindi degli indici in grado di estrapolare dei dati che permettano una ricerca più veloce. Possiamo pensare ad un indice come una struttura dati che ci permette un veloce accesso random ai dati memorizzati.
Lucene in genere memorizza gli indici in file su filesystem come set di file indice.
Il primo step per effettuare una ricerca è l’accesso al contenuto che si vuole ricercare.


Acquisire il contenuto

Per acquisire un contenuto potrebbero esserci vari livelli di difficoltà connessi con la dispersione e le differenze tra i vari tipi di dato da indicizzare, infatti se dobbiamo indicizzare dei semplici file XML o dati in un database, l’operazione sarà abbastanza semplice, ma le cose cominceranno a complicarsi se i dati da indicizzare provengono dal file system, CMS, database, vari siti web, ecc…
Un altro aspetto fondamentale da considerare sarà l’accesso ai dati che dovranno essere indicizzati, perché bisogna prevedere un ACL (Access Control List) per definirne il comportamento. Per l’indicizzazione di grandi quantità di dati, inoltre, sarà importante prevedere una acquisizione incrementale dei dati in modo da non rendere tale operazione troppo dispendiosa.
Lucene, ovvero le sue funzionalità core, non forniscono supporto per l’acquisizione dei contenuti, che quindi saranno funzionalità completamente a carico della nostra applicazione.
Ci sono diversi progetti open source che forniscono le funzionalità di crawler che è possibile utilizzare per acquisire i contenuti:

  • SOLR : Progetto correlato con Lucene (Apache) che fornisce supporto per l’ingestione di database relazionali e feed XML e può anche gestire rich document attraverso l’integrazione con Tika.
  • Nuch: permette di fare ingestione scoprendo contenuti facendo crawling di siti web.
  • Grub: web crawler popolare.
  • Heritrix
  • Droids
  • Aperture: ha il supporto per fare il crawling dei siti web, file system e mail box per estrarre e indicizzare il testo.
  • The Google Enterprise Connector Manager: fornisce dei connettori per diversi repository non web.
  • Costruire i documenti

    Dopo aver ottenuto i contenuti grezzi che avranno bisogno di essere indicizzati, ci sarà bisogno di tradurre i nostri contenuti in “unità”, spesso chiamate documenti, che sono i contenuti utilizzati da un motore di ricerca.
    Tale operazione è molto delicata, perché implicherà la possibilità di fare delle ricerche in un determinato modo.
    L’operazione di “estrazione” di un documento dal contenuto grezzo è spesso semplice, se il documento è esso stesso testuale (indicizziamo qualunque contenuto che possa essere considerato o convertito in testo), ma quando i nostri dati sono binari, per esempio in un PDF o in un documento word, le cose si complicano. Sarà, infatti, necessario filtrare prima i dati per poi poterli gestire come testo. Sarà possibile, quindi, definire un filtro che prendendo in pasto un grande testo in un body, ne faccia prima un controllo semantico, per gestirne al meglio nomi, date e così via, come sarà possibile definire un documento a partire da più sorgenti.
    Un’altra parte fondamentale di questo processo è il boosting di alcuni documenti e dei campi, in modo da dare loro maggior peso nelle ricerche. L’operazione di boosting può essere fatta staticamente, durante il processo di indicizzazione, oppure dinamicamente, ovvero quando si effettuano le ricerche. Di default Lucene, come molti altri motori di ricerca, esegue un boosting statico delle parole più corte rispetto a quelle più lunghe.
    Per poter essere indicizzato un campo testuale ha bisogno di essere prima analizzato.


    Analizzare i documenti

    Nessun motore di ricerca indicizza il testo direttamente, piuttosto il testo viene separato in una serie di elementi atomici chiamati token.
    Questa operazione di “spacchettamento” viene effettuata durante l’operazione di analisi (analyze).
    Lucene mette a disposizione una serie di analyzer che possono essere utilizzati singolarmente o combinati in una nostra implementazione custom di un analyzer.
    La fare successiva è l’indicizzazione.


    Indicizzare un documento

    Lo step finale di questo processo è l’indicizzazione dei nostri documenti all’interno di Lucene, che permette in seguito di effettuare le ricerche desiderate e ottenere i risultati attesi.

    Nei prossimi articoli parlerò in modo più approfondito delle librerie che abbiamo a disposizione per costruire il nostro motore di ricerca e entreremo più in dettaglio di tutti i componenti necessari.

RSS AngularJob

ddelfio Written by: