Due parole su Lucene (bozza)

 

PREMESSA: questa è una bozza, se avete correzioni o consigli contattatemi.

Se desideriamo inserire un piccolo Google all’interno dei nostri applicativi Lucene è proprio quello che fa per noi. Interamente scritto in java (ma ne esistono anche altre implementazioni per .net e in C) fornisce una libreria di semplice utilizzo per l’indicizzazione di testi su cui eseguire una ricerca. Il suo funzionamento è veramente molto elementare, ecco un semplice esempio pieno di commenti:
Nel codice di esempio esistono delle costanti per la definizione dei campi, vediamole in dettaglio:

codice.jpg

(Lo so che non è bellissimo il codice sorgente in una immagine e che i caratteri accentati si vedono male, ma sto cercando un modo per fare visualizzare il listato senza troppi casini sul blog, quindi per il momento accontentatevi, nel titolo c’è scritto o non c’è scritto bozza?)

Field.Store
YES Conserva il campo nel file indice senza fare nessuna operazione su di esso. Questo va bene per testi di piccole dimensioni perchè ha tempi di elaborazione minori rispetto alla costante COMPRESS.
NO Non conserva il campo nel file indice.
COMPRESS Conserva il campo nel file indice comprimendolo. Il valore indicizzato nel file indice non è comprensibile all’uomo. Questa costante è consigliato nel caso in cui si vogliano indicizzare testi molto lunghi o binari.
Field.Index
NO Non indicizza il campo, cioè non è possibile eseguire ricerche sul campo, ma è recuperabile tramite il metodo get(String) sull’oggetto Document.
NO_NORMS Indicizza il campo senza usare un analizzatore e disabilita la memorizzazione delle norme. Questo tipo di indicizzazione occupa più spazio su disco perchè il campo non viene normalizzato, ma si ha un miglioramento delle prestazioni. Per avere miglioramenti effettivi, tutte le istanze di quel campo devonono essere indicizzate utilizzando questa costante.
TOKENIZED Indicizza il valore del campo in modo che possa essere ricercabile. Per svolgere questa operazione utilizza un analizzatore che verrà utilizzato anche per le normalizzazioni. Questo sistema va bene per la maggioranza dei testi.
UN_TOKENIZED Indicizza il campo senza usare l’analizzatore. Questa costante va bene quando si devono indicizzare valori sui quali si desidera eseguire una ricerca mirata, come ad esempio dei codici identificativ.

Come potete notare dal semplice esempio qui sopra Lucene si limita a indicizzare dei semplici file di testo, quindi se avete esigenza di indicizzare file di formato diverso dovete ricorrere ad altre librerie che vi permattano di avere un file di testo tradizionale. Nella seguente tabella riporto il tipo di file e di fianco il nome di una o più librerie da utilizzare per trasformare il documento in semplice testo:

Documenti Microsoft Office (doc, xls, ppt, etc.) Apache POI
Portable Document Format (PDF) PDFBox
JPedal
XPDF (non è in java)
PDFTOHTML (basato su XPDF)
HTML CyberNeko HTML Parser
Jericho HTML Parser
RTF Swing RTFEditorKit class
Open Office LIUS

Un problema che può nascere dal fatto che i computer a 32 bit non riescono a gestire file più grandi di 2GB e quindi potrebbero esserci problemi con le dimesioni del file indice. Per consigli su come superare questo problema vi consiglio di leggere questo articolo.

Lucene ci permette di eseguire anche complesse operazioni di ricerca sui nostri documenti. Per fare ciò mette a disposizione una completa sintassi per la creazione di query di ricerca. Per iniziare è bene chiarire che è possibile ricercare un singolo termine (ad esempio TUTTI ) oppure una intera frase. In questo ultimo caso il nostro parametro di ricerca andrà inserito all’interno delle virgolette (ad esempio: “Tutti avanti” ). All’interno dei nostri parametri di ricerca è anche possibile utilizzare le classiche wildcard ?(un solo carattere) e *(n caratteri) facendo solo attenzione a non utilizzarli come primo carattere per la ricerca infatti il singolo termine
*TTI restituirà una eccezione di tipo org.apache.lucene.queryParser.ParseException. Come visto nel codice di esempio è possibile effettuare anche ricerche di tipo fuzzy tramite l’operatore tilde (~). Di fianco a questo operatore è anche possibile specificare un valore numerico che assume significati diversi se si sta utilizzando come parametro di ricerca un termine singolo o una frase. Nel primo ( TUTTI~0.7 ) può essere un valore compreso tra 0 e 1 (1 escluso) e indica la similarietà minima che si desidera ottenre nella ricerca e che di default è 0.5, mentre nel secondo caso indica la distanza in parole in cui si possono cercare i termini della frase, ad esempio “tutto ok”~10
cercherà una frase contenente tutto bene in una distanza massima di 10 parole. Per eseguire le ricerche in range si usa invece l’operatore TO (ad esempio Angelo TO Carlo restituirà tutti i campi contenenti risultati compresi tra il primo ed il secondo membro).
Per quanto riguarda la ricerca di termini multipli è possibile utilizzare la parentesizzazione tramite le parentesi tonde e gli operatori booelani AND, OR, NOT. Al loro posto è anche possibile utilizzare degli operatori da anteporre al termine o alla frase da ricercare, rispettivamente utilizzeremo i caratteri: più (+), spazio bianco( ), e meno (-). ad esempio ricercare +davide +cerbo equivale a davide AND cerbo.
Se si devono ricercare caratteri speciali (+ – && || ! ( ) { } [ ] ^ ” ~ * ? : \) bisogna eseguirne l’escape tramite il carattere \.

Infine per approfondire questo argomento vi consiglio un po’ di links interessanti:

Crawler opensource in java
Egothor : una alternativa opensource a Lucene
API di Lucene
Sito ufficiale di Lucene
Un progetto per utilizzare Lucene tramite Hibernate
Una guida in italiano su come utilizzare la ricerca fulltext con MySQL
Annunci

~ di jesty su dicembre 17, 2007.

5 Risposte to “Due parole su Lucene (bozza)”

  1. Sei un grande!!!
    cercavo qualcosa che mi facesse capire come utilizzare Lucene e tu mi hai dato tutte le informazioni di cui necessitavo! Grazie davvero!

  2. wow:D che onore 😉

  3. Se interessati allo stesso argomento ho scritto riguardo
    Esempio base per indicizzare e ricercare con Lucene
    http://programmaremobile.blogspot.com/2008/10/lucene-un-motore-di-ricerca-in-java.html#links

    Esempio e spiegazioni riguardio lo spellChecking (Il “forse cercavi ..”)
    http://programmaremobile.blogspot.com/2008/10/lucene-spellchecker-forse-cercavi.html#links

  4. Ciao. Molto interessante. Però relativamete al limite di 2 GB non ho letto nulla. Hai qualche informazione in merito?
    Grzie

  5. ciao, se invece di un termine o una frase volessi tutti i termini dell’indice? come si può fare

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

 
%d blogger hanno fatto clic su Mi Piace per questo: