Principio
Un motore di ricerca può basarsi su due principi. Il primo è cercare stupidamente nel tipo di archivio esistente (file HTML, database... secondo il tipo di sito). Questo metodo è molto lento perché il tipo di archiviazione non è previsto a questo scopo.
Il secondo metodo, che è stato scelto per SPIP (e che è lo stesso di tutti i motori di ricerca professionali), è di stabilire un modo di archiviazione specifico ai bisogni della ricerca. Per esempio, il punteggio di ogni parola di un articolo può essere immagazzinato direttamente al fine di essere ritrovato facilmente, e di avere il punteggio totale di una ricerca con una semplice addizione. Il vantaggio è che la ricerca è molto rapida: quasi quanto qualsiasi altra elaborazione di pagina. Lo svantaggio è che è necessaria una fase di costruzione di questo archivio di informazioni: ciò si chiama indicizzazione. L’indicizzazione ha un suo costo in termini di risorse (tempo di elaborazione e spazio sul disco), e introduce anche un leggero ritardo temporale tra l’aggiunta o la modifica del contenuto e l’esito di questa aggiunta o modifica sui risultati della ricerca.
D’altra parte, nel caso di SPIP, siamo obbligati a utilizzare il PHP e MySQL poiché tutto il programma è basato su di essi, e ciò non permette di realizzare un motore di alte prestazioni, in termini di rapidità come pure di pertinenza o di arricchimenti diversi (indicizzazione dei documenti esterni al sito, creazione di campi semantici che permettono di proporre ricerche più fini, ecc.).
Il vantaggio di avere un motore interno, tuttavia, è che esso permette di gestire la visualizzazione dei risultati attraverso gli stessi sistemi (modelli) del resto delle pagine di SPIP, e all’interno dello stesso ambiente grafico.
L’indicizzazione
L’indicizzazione avviene durante le visite del sito pubblico. Al fine di evitare che il cumulo di un’indicizzazione e di un aggiornamento della pagina non causi un errore di timeout sui server particolarmente lenti, SPIP attende che una pagina sia visualizzata usando la cache [1].
L’indicizzazione tratta a uno a uno tutti i diversi dati testuali di un dato contenuto: per esempio, per un articolo, l’introduzione, la descrizione, il titolo, il testo... Per ogni dato testuale, il punteggio di ogni parola viene calcolato contando semplicemente il numero di occorrenze. A tale scopo, le parole di tre caratteri o meno sono ignorate (esse sono per lo più non significative e appesantirebbero il database); d’altra parte, i caratteri accentati sono traslitterati (convertiti nei loro equivalenti non accentati), per evitare i problemi di font di caratteri e anche per permettere di effettuare le ricerche in versione senza accenti.
Poi, i punteggi di ogni parola vengono sommati, in maniera ponderata, tra i diversi dati testuali del contenuto indicizzato. La ponderazione permette, per esempio, di dare più peso alle parole presenti nel titolo di un articolo che nel corpo del testo oppure nel post scriptum...
Le funzioni di indicizzazione possono essere studiate all’interno del file
ecrire/inc_index.php3
. Per visualizzare meglio la dinamica di indicizzazione del sito, è possibile aprire il file ecrire/data/spip.log
, oppure guardare la pagina ecrire/admin_index.php3
(nota: questa pagina, ancora in via sperimentale, non è distribuita con tutte le versioni di SPIP ed è disponibile solo in lingua francese).
Nella versione [SPIP 1.6], sono state apportate modifiche importanti al comportamento del motore di ricerca:
- migliore comportamento in un ambiente multilingue;
- il trattino basso (underscore) non è più considerato come un separatore di parole, ma come un carattere alfabetico (utile in caso di documentazione informatica);
- le parole di due (e più) lettere che contengono solo maiuscole e cifre sono considerate sigle, e vengono indicizzate, risolvendò così uno dei principali inconvenienti della limitazione dell’indicizzazione alle parole di più di 3 lettere (G8, CNT, ONU vengono quindi indicizzati).
La ricerca
La ricerca si effettua semplicemente separando il testo di ricerca nelle parole che lo compongono; il medesimo filtro viene applicato durante l’indicizzazione: eliminazione delle parole di tre lettere o meno (eccetto le sigle), e traslitterazione.
Per ogni contenuto ricercato, viene recuperato il punteggio delle diverse parole e poi addizionato al fine di ottenere il punteggio totale. Infine, i risultati sono generalmente mostrati in ordine decrescente di punteggio ({par points}{inverse}
), ovvero di pertinenza (ma ciò è lasciato alla volontà della persona che scrive i modelli di impaginazione).
Prestazioni
Rapidità
Su di un server recente e non troppo carico, l’indicizzazione di un testo lungo (diverse decine di migliaia di caratteri) durerà uno o due secondi: l’attesa è pressoché impercettibile, in confronto al tempo di caricamento attraverso la rete. I contenuti brevi vengono indicizzati quasi istantaneamente. Naturalmente, queste affermazioni devono essere modulate in base alla dimensione del sito. Un sito molto grande rischia di avere tempi di indicizzazione leggermente più lunghi; per dare un’idea, diciamo che un sito come Le Courrier des Balkans contiene, alla data di redazione di questo articolo, circa 3 800 articoli pubblicati, e oltre 7500 messaggi nei forum, e il motore di ricerca di SPIP non mostra alcun segno di cedimento.
D’altronde, dal punto di vista statistico, è possibile considerare in maniera approssimativa che ogni contenuto viene indicizzato una sola volta: tenuto conto che solitamente vi sono molte più visite su un sito che aggiornamenti del suo contenuto, il sovraccarico del server sembra trascurabile.
Qualità
La qualità dell’indicizzazione è inferiore rispetto ai motori di ricerca professionali. Poiché il PHP è un linguaggio piuttosto lento, la fase di estrazione delle parole è stata semplificata al massimo per ottenere dei tempi di indicizzazione minimi. Di conseguenza, i dati di indicizzazione comportano alcuni "rifiuti", ovvero dei pezzi di testo che non sono "vere" parole, ma che sono stati indicizzati come se lo fossero (sono spesso di contenuto tecnico come nomi di file, o brani con punteggiatura impropria). L’esempio di uZine, dove si riscontra il 2 % circa di tali "rifiuti", ci lascia pensare che questi dati sono una quantità trascurabile, anche perché vi sono poche probabilità che diano un risultato positivo durante una ricerca.
La ricerca non offre operatori booleani, e l’operatore logico implicito è più o meno un "OR". Tuttavia, dalla versione SPIP 1.7.1, gli articoli trovati sono visualizzati in un ordine che privilegia i risultati contenenti il maggior numero di parole scritte precisamente secondo il testo cercato. In tal modo, una ricerca su "la mano rossa" metterà in evidenza gli articoli contenenti "mano" e "rossa", molto prima degli articoli che contengono solo "manovalanza" o "rossana" - anche questi ultimi appariranno, ma saranno in fondo alla classifica.
Spazio su disco
MySQL non è stato concepito per l’archiviazione di dati di indicizzazione, quindi l’utilizzo del motore di ricerca tende a ingigantire lo spazio sul disco utilizzato per il database. Per essere più precisi, diciamo che un contenuto genera dei dati di indicizzazione di dimensione compresa tra la dimensione del contenuto e il suo doppio. Quindi, se si fa un’astrazione dei dati che non causano l’indicizzazione (i forum, per esempio), l’indicizzazione causa l’aumento del doppio o del triplo del database. Ciò può essere costrittivo se lo spazio dedicato al proprio sito è limitato.
Se si disattiva il motore di ricerca per economizzare lo spazio sul disco, non si deve dimenticare di cancellare i dati di indicizzazione (nella pagina di salvataggio/ripristino del database) al fine di liberare realmente lo spazio disco occupato da questi dati.