Ricerca all'interno dei documenti

In questi giorni sono parecchio incasinato con il lavoro e per questo sto tralasciando un po' la comunity, (forum, blog, ecc.) e me ne scuso, d'altro canto il lavoro è sempre il lavoro.

In particolar modo sto lavorando alla realizzazione di un motore di ricerca un po' diverso dal solito, ossia con la possibilità di indicizzare dei documenti presenti all'interno del nostro sito o indicizzare pagine esterne tramite url.

Per capire bene la cosa immaginiamo un sito dove le news, articoli, delibere, ecc, vengono create dinamicamte tramite un CMS o un FTP da parte dell'amministratore. 
Nel motore di ricerca del sito dobbiamodo dare la posssibilità di indicizzare anche il testo contenuto in questi file.Operazione solitamente scomoda se il cms non offre questa possibilità o l'amministratore non scrive le keyword del documento distribuito on-line in qualche field che ci andiamo a leggere successivamente.

Partendo da quest'idea la prima cosa fatta è stata una ricerca sul web di prodotti già esistenti e qui sono incappato su DotLucene, motore di ricerca realizzato in .Net, che per lo storage dell'indice utilizza un file e non un database. Da lì sono finito su SeekaFile, che non è altro che un servizio windows che indicizza dei file presenti all'interno di un path impostato da noi, con in più una dependency sul file che, nel caso venga modificato, l'indice è automaticamente aggiornato.Funzione spettacolare, ma non sempre si ha la possibilità di installare dei servizi custom sul server, quindi ho preso il tutto, ho scorporato il servizio, gli ho aggiunto un po' di plug-in per leggere l'html direttamente da un url ripulendolo e indicizzando solo il testo, stessa cosa per i PDF e RTF e ottenendo come risultato di ricerche e indicizzazione delle mie custom entity e collection (ormani le uso da tutte le parti, non mi ricordo neanche come si crea un datatable).

L'aspetto più interessante di questa versione da me creata è che tutto è utilizzabile senza realizzare nessun setup ma soltanto impostando dei valori nel web.config ed effettuando una chiamata quando si crea, upload o modifica un file.
L'indicizzazione avviene tramite thread, con una gestione della coda, a volte per leggere un pdf di diversi mega e ripulirlo la macchina può impiegare diversi secondo, ma la ricerca continua a funzionare e tutti gli altri file da indicizzare sono in attesa che finisca il primo thread.
L'indicizzazione avviene in lowpriority, il che significa che in caso altre applicazioni sul server richiedano risore lui le rilascia, aspettando che la macchina si meno indaffarata :)

Ricapitolando le caratteristiche del motore.

  • Indicizzazione su file senza Database;
  • Non necessita di installazione;
  • Indicizza documenti DOC,PDF,XLS,PPT,RTF,HTML,TXT,XML;
  • Indicizza direttamente l'HTML da un url (grabba il codice lo filtra e lo indicizza)
  • Possibilità di crearsi plug-in personalizzati e caricarli a runtime;
  • Possibilità di indicizzare direttamente delle directory;
  • Utilizzo di custom entity e collection;
  • Gestione della coda di indicizzazione;
  • Low priority per l'indicizzazione.
  • e poi non so vediamo un po' l'ispirazione cosa porta :)

Per chi fosse interessato alla cosa non posso che dire Stay Tuned!!.
( frase brutalmente copiata, non dico a chi, ma sono sicuro che lui lo sa )

Ovviamente se avete esperienze, idee o altro sono ben accette.
Chissà che non mi venga in mente di realizzare un desktop search tipo quello di Google o Microsoft, il principio è lo stesso. :D

 


Comments