Principi
Hi ha dues grans maneres de fer un motor de cerca. La primera és cercar directament en el tipus de suports existents (fitxer HTML, base de dades... segons el tipus de lloc). Aquest mètode és molt lent ja que el tipus de suport no està previst per fer això.
El segon mètode, que és el que ha escollit l’SPIP (i que és també el de tots els motors de cerca professionals), consisteix en establir una manera d’emmagatzemar específica pels desigs de la cerca. Per exemple, el resultat de cada paraula d’un article pot estar emmagatzemat directament per tal de facilitar que es pugui trobar fàcilment i tenir el resultat final d’una cerca amb una simple addició. L’avantatge és que la cerca és molt més ràpida: gairebé tan ràpida que no importa el número de pàgines que calcula. L’inconvenient és que necessita una fase de construcció de l’esmentat emmagatzematge de les informacions: l’anomenada indexació. La indexació té un cost en termes de recursos (temps de càlcul i d’espai de disc), i introdueix igualment un lleuger desfasament temporal entre afegir o modificar un contingut i la repercussió d’aquest afegit o d’aquesta modificació en els resultats de la cerca.
D’altra banda, en el cas de l’SPIP, estem obligats a utilitzar PHP i MySQL com en la resta del programari, cosa que no permet realitzar un motor molt competitiu en termes de rapidesa, però també de pertinença o d’enriquiments diversos (indexació de documents externs al lloc, creació de camps semàntics que permetin proposar cerques més afinades, etc.).
L’avantatge del motor intern, no obstant, és que permet de gestionar la publicació dels resultats per mitjà dels mateixos mètodes (esquelets) que la resta de pàgines SPIP, i a l’interior del mateix entorn visual.
La indexació
La indexació és realitza durant les visites al lloc públic. Per evitar que l’acumulació d’una indexació i un càlcul de pàgina portin a un timeout en aquells servidors que són particularment lents, SPIP espera que una pàgina sigui mostrada utilitzant la memòria cau [1].
La indexació tracta una a una les diferents dades textuals d’un contingut donat: per exemple, per un article, la capçalera, la descripció, el títol, el text... Per cada dada textual, el resultat de cada paraula es calcula comptant simplement el número d’ocurrències. Per això, les paraules de tres o menys caràcters són ignorades (són, en la seva majoria, no significatives i alenteixen la base de dades); per una altra banda, els caràcters accentuats són transliterats (convertits en els seus equivalents no accentuats), per evitar problemes de jocs de caràcters i també per permetre efectuar cerques en versió no accentuada.
De seguida, els resultats de cada paraula són acumulats, de manera ponderada, entre les diferents dades textuals del contingut indexat. La ponderació permet, per exemple, donar més pes a les paraules presents al títol d’un article que aquelles que es troben al cos del text o a la postdata...
Les funcions d’indexació poden ser estudiades al fitxer ecrire/inc_index.php3. Per visualitzar millor la dinàmica d’indexació del lloc, podeu obrir el fitxer ecrire/data/spip.log, o fins i tot mirar la pàgina ecrire/admin_index.php3 (nota: aquesta pàgina, encara experimental, no es dóna amb totes les versions d’SPIP, i només existeix en francès). Ha estat retirada d’[SPIP 1.9] i des d’ara està disponible en el plugin recherche_etendue amb altres funcions de gestió de la indexació).
A la versió [SPIP 1.6], s’han fet importants modificacions al comportament del motor:
- millor comportament en un entorn multilingüe;
- el caràcter de subratllat (underscore) ja no es considera com un separador de paraula sinó com un caràcter alfabètic (útil per la documentació informàtica);
- les paraules de dues lletres (o més) que no contenen ni majúscules ni xifres són considerades com a sigles, i són indexades, suprimint d’aquesta manera una de les principals limitacions d’indexació a les paraules de 3 lletres (G8, CNT, ONU són des d’ara indexades).
La cerca
La cerca s’efectua simplement separant el text de cerca en les seves diferents paraules; s’aplica el mateix filtre que per la indexació: supressió de paraules de tres o menys lletres, i conversió dels caràcters accentuats.
Per cada contingut cercat, el resultat de les diferents paraules és recuperat de seguida i després addicionat per tal d’obtenir el resultat total. Finalment, els resultats són generalment publicats per ordre decreixent de resultat ({par points}{inverse}
), és a dir de pertinença (però això es deixa a gust de la persona que escriu les plantilles de compaginació).
Rendiment
Rapidesa
En un servidor recent i no gaire carregat, la indexació d’un text llarg (diverses desenes de milers de caràcters) tardarà entre un i dos segons: l’espera és gairebé imperceptible, comparat amb els terminis de càrrega per la xarxa. Els continguts curts són indexats de manera gairebé instantània. Per descomptat que aquestes afirmacions les hem d’adaptar a la mida del lloc. Un lloc veritablement molt gran té el risc de veure com els temps d’indexació s’amplien lleugerament; per relativitzar, assenyalem que un lloc com Le Courrier des Balkans comporta, en el moment de ser redactat aquest article en francès (llengua de referència), a l’entorn de 3800 articles publicats, i més de 7500 missatges de fòrum, i que el motor de cerca d’SPIP no mostra cap signe de feblesa.
D’altra banda, estadísticament, es pot considerar de forma aproximada que cada contingut només serà indexat una sola vegada: tenint en compte que hi ha, normalment, força més visites a un lloc que actualitzacions de continguts, l’augment de càrrega del servidor és gairebé menyspreable (excepte en els casos de màquina molt lenta).
Qualitat
La qualitat d’indexació és més fiable que en els motors de cerca professionals. Com que el PHP és un llenguatge més lent, la fase d’extracció de paraules s’ha hagut de simplificar al màxim per tal que els temps d’indexació siguin els mínims. Com a conseqüència, les dades d’indexació comporten algunes «restes», és a dir trossos de text que no corresponen a «veritables» paraules, però que han estat indexats com a tals (es tracta sovint de continguts tècnics com noms de fitxers, o de puntuacions no correctes). L’exemple d’uZine (on es constata a l’entorn d’un 2 % d’aquestes «restes») ens fa pensar que aquestes dades són una quantitat inapreciable a l’hora que hi ha molt poques probabilitats que donin un resultat positiu en una cerca.
La cerca no ofereix operadors boleans, l’operador implícit és com a molt un «OU» lògic. No obstant això, a partir d’SPIP 1.7.1, els articles trobats es mostren en un ordre que privilegia els resultats que contenen el màxim de paraules ortografiades segons la petició. Així, una petició sobre «la mà roja» posarà en evidència els articles que continguin «mà» i «vermella», molt per davant dels articles que només continguin «manteniment» o «roger» - aquest apareixeran, però molt més lluny en la classificació.
Espai en disc
No havent estat MySQL concebut especialment per emmagatzemar dades d’indexació, la utilització del motor de cerca té tendència a engrandir l’espai en disc utilitzat per la base de dades. Per concretar-ho d’alguna manera, diguem que un contingut genera unes dades d’indexació d’una mida compresa entre la mida del contingut i el doble d’aquest. Per tant, si fem l’abstracció de les dades en les que no es fa la indexació (els fòrums per exemple), la indexació fa doblar o triplicar l’espai ocupat per la base de dades. Pot arribar a ser molest si no teniu massa espai.
Si alguna vegada desactiveu el motor de cerca per tal d’economitzar espai en disc, no oblideu esborrar a continuació les dades d’indexació (a la pàgina de còpia de seguretat/restauració de la base de dades) per tal d’alliberar realment l’espai en disc ocupat per aquestes dades.