ScaraBook, un delicious migliore

Data: 29 agosto 2008 Categoria: mysql, webdev

Come gestire i propri bookmarks? Ho usato servizi on-line e applicazioni da installare sul proprio server. Nonostante tutto, per comodità o per pigrizia, faccio prima (e meglio) ad andare su un motore di ricerca. È possibile fare un’applicazione altrettanto comoda e veloce?

Perché non sono soddisfatto

Ho provato del.icio.us, magnolia, furl e vari altri servizi on-line. Ho installato sul mio server scuttle. Ho usato freetag per scrivere una mia applicazione. Sono tutti ottimi, ma alla fine non li usavo perché per le mie esigenze li ho trovati scomodi, sia per la ricerca che per l’inserimento. Ho individuato il problema proprio nell’uso dei tag. Quello che volevo era un box di ricerca, digitare alcuni termini e ottenere dei risultati pertinenti.

Ricerca "full text"

Alla fine era Google il mio gestore di bookmarks. Volevo fare qualcosa che avesse la stessa immediatezza d’uso. Il problema era poter indicizzare i dati. Chi usa i database sa bene che una ricerca per sottostringa (qualcosa come: where field like %search%) è inefficiente. La soluzione è venuta proprio da MySQL che ha implementato degli indici di tipo full-text. Tali indici permettono di realizzare facilmente un motore di ricerca in stile Google.

Limitazioni

Per default gli indici full-text indicizzano solo le parole con almeno 4 caratteri. Per poter indicizzare parole più corte bisogna cambiare il parametro ft min word len nel file di configurazione di MySQL. La dimensione dell’indice sarà molto influenzata da questo parametro. Come esempio posso riportare che per un’altra mia applicazione che usa tale indicizzazione con una lunghezza minima di 3 lettere, a fronte di una base dati di circa 96MB (oltre 23.000 record) l’indice è cresciuto fino a 71MB. In compenso le ricerche sono di una velocità impressionante.

Gli indici full-text possono essere creati solo su tabelle di tipo MyISAM e non è disponibile su tabelle InnoDB.

Semplicità

La semplicità che si può ottenere nell’interfaccia (un solo box di ricerca) è pari a quella della base dati. Tutti i bookmarks sono memorizzati in una singola tabella. Su questa tabella verrà costruito l’indice full-text che servirà alla ricerca. Vengono quindi eliminate tutte le tabelle aggiuntive e le relazioni necessarie per implementare i comuni schemi usati nelle soluzioni basate sui tag.

Sintassi ricerche

Per default MySQL restituisce tutti i risultati che contengono almeno uno dei termini cercati, ordinati in base alla loro rilevanza. Questo significa che cercando "image free hosting" verranno restituiti anche tutti i record che contengono solo "hosting", ma i record che contengono tutte le tre parole verranno ordinati per primi. Questo significa avere in cima alla lista dei risultati i record più rilevanti.

Si possono rifinire le ricerche usando degli operatori booleani che permettono di limitare molto il numero di risultati. Ad esempio usando il carattere "+" impongo che il termine deve essere presente, mentre con il carattere "-" il termine non deve essere presente. Una ricerca booleana tipo "+image +free -hosting" impone che i record da restituire devono contenere entrambi i termini "image" e "free" ma non devono contenere il termine "hosting". Il numero di risultati sarà molto inferiore. Questo permette una grande flessibiltà nelle ricerche.

Niente paginazione

Perché paginare i risultati? Se non ottengo quello che cerco nei primi 10 o 20 risultati, allora ho sbagliato ricerca. I risultati di una ricerca non sono un album di fotografie da sfogliare, sono uno strumento per fare qualcosa senza perdere tempo. Google è obbligato a paginare i risultati perché certe ricerche restituiscono moltissimi risultati, ma una base dati come quella dei bookmarks personali non restituirà mai tanti record. Preferisco avere una pagina con 100 risultati pittosto che dover sfogliare 10 pagine da 10 risultati ognuna. È una prefernza personale, una scelta di progetto e non una limitazione delle tecologie usate. Al massimo potrei decidere di limitare i risultati ai primi 20 o 50.

Bookmarklet

La facilità di ricerca deve essere associata ad un altrettanto facile inserimento dei nuovi bookmark. Per questo ho dotato ScaraBook di una bookmarklet che, al pari degli altri bookmark manager, permette l’inserimento di un nuovo bookmark in maniera immediata. Se si evidenzia del testo prima di usare la bookmarklet, questo testo verrà automaticamente inserito nella descrizione.

Se l’url che vogliamo salvare è già presente nel database allora verrà mostrata la form per la modifica del record.

Il bello è che non c'è nessun bisogno di inserire manualmente dei tag. Il nuovo record verrà immediatamente indicizzato appena salvato nel database e potremo ritrovarlo cercando le parole presenti nel titolo o nella descrizione. L’inserimento di ulteriori keywords è facoltativo e utile solo in quei casi in cui vogliamo che il record venga indicizzato anche con altri termini che non siano già presenti nel titolo o nella descrizione.

Strumenti usati

Come database è stato utilizzato MySQL dato che la sua indicizzazione full-text è alla base del funzionamento di ScaraBook.

Il linguaggio di programmazione è il "solito" PHP e ho sfruttato questa occasione per provare il framework CodeIgniter con una applicazione che non fosse il solito "blog in 10 minuti".

Per l’esportazione dei miei bookmarks da del.icio.us ho utilizzato MySQLicious

Demo

È disponibile una demo di ScaraBook liberamente accessibile e utilizzabile, anche la bookmarklet è stata abilitata. Ovviamente è solo una demo e il database verrà periodicamente ripristinato.

Riferimenti