Creare un motore di ricerca con Lucene e PHP

Durante uno dei miei progetti mi è capitato di dover trovare una soluzione per creare un motore di ricerca in grado di indicizzare diversi tipi di file, come documenti di Microsoft Office, PDF e testo semplice.

Indicizzare documenti Microsoft Office con Lucene

La prima soluzione che mi è venuta in mente è di utilizzare Lucene.
Lucene è un progetto open source che fornisce la tecnologia necessaria per l’indicizzazione e la ricerca di testo. È scritto in Java, quindi è indipendente dalla piattaforma, inoltre non è una vera e propria applicazione, ma un insieme di librerie, quindi si può aggiugere come modulo ad applicazioni già esistenti. Altro punto di forza è la possibilità di effettuare ricerche full text.

Sebbene sia molto avanzato, da solo non consente l’indicizzazione di documenti nei formati già citati, però fornisce delle API per consentire di effettuare il parsing con codice esterno.
Per svolgere questo compito si può utilizzare Tika, un sotto-progetto di Lucene.

Con questo articolo metto a disposizione un progetto in Java che unisce le due tecnologie, sviluppato da Christoph Hartmann (http://www.acidum.de/about/).
Nel file allegato trovate tutti i sorgenti e anche le librerie necessarie per il completo funzionamento del motore di indicizzazione. Una volta scompattato, è possibile importare direttamente il progetto in Eclipse (http://www.eclipse.org/).

I file da indicizzare vanno inseriti nella directory ./bin/test-documents e, una volta eseguito il programma correttamente, troverete i file di indice sotto ./index.

A questo punto abbiamo a disposizione un potente motore di indicizzazione in grado di processare molti tipi di file.
Il progetto può essere modificato secondo le necessità, come ad esempio modificare la cartella in cui cercare i file oppure modificare la cartella di output.
Si può pensare anche di schedulare il processo per eseguirlo automaticamente.

E’ possibile scaricare il progetto da questo LINK

Interfaccia web in PHP

Per creare una interfaccia web da cui poter effettuare le ricerche e mostrare i risultati, quindi in grado di utilizzare gli indici precedentemente prodotti, viene in aiuto lo Zend Framework ed in particolare la libreria Zend_Search_Lucene.

Questa libreria ha un doppio uso: è in grado di indicizzare documenti di testo (anche in formato Microsoft Office 2007) e produrre indici compatibili con quelli di Lucene, inoltre fornisce le funzioni per processare le query di ricerca e restituire i risultati.

Di seguito una piccola porzioni di codice per mostrare come eseguire una ricerca:

$index = Zend_Search_Lucene::open('./index');
 
$query = 'see*';
$hits = $index->find($query);
foreach ($hits as $hit)
{
$document = $hit->getDocument();
echo $document->filename . '<br />';
}

Nella prima riga viene indicata la directory contenente i file di indice, nella seconda viene definita la query di ricerca, in quelle successive viene eseguita la ricerca e visualizzato il nome dei file che rispondono ai criteri.
Le query di ricerca possono essere assemblate come per la ricerca su Google e dispongono di diversi caratteri jolly (ad es. ? = un singolo carattere, * = zero o più caratteri).

Risorse

http://www.acidum.de/2009/01/07/index-microsoft-office-files-with-lucene/
http://lucene.apache.org/java/docs/
http://lucene.apache.org/tika/
http://framework.zend.com/manual/en/zend.search.lucene.html

2 thoughts to “Creare un motore di ricerca con Lucene e PHP”

  1. Ciao , approfitto di questo tuo ottimo articolo per porre un quesito, dopo varie ricerche non riesco a venirne a capo, in pratica la sintassi prevista per la ricerca con Zend Lucene mi restituisce un blocco dello script in esecuzione e senza restituire errori nei log apache e php. L’index dei documenti ha funzionato senza intoppi ma quando vado con il find() lo script si blocca proprio al lancio di questo comando e non ci sono errori

Rispondi a Alessio Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.