Con el fin de ser rápido y eficaz (es decir para que proporcione respuestas pertinentes), el motor de SPIP utiliza un sistema de indexación de los contenidos. La indexación consiste en analizar todos los textos contenidos en SPIP, en extraer todas las palabras, y en registrar para cada palabra el lugar donde aparece.
Como el índice de un libro presenta las palabras importantes del libro, seguidas por los números de las páginas donde se encuentran, el índice del motor de búsqueda hace corresponder para cada palabra utilizada en el sitio el número del artículo, de la breve... donde se encuentra.
Después, cuando se utiliza el motor para efectuar una búsqueda, SPIP no necesita consultar la totalidad de los textos del sitio, simplemente irá a consultar el índice para saber dónde se encuentran esas palabras. Así se gana una enorme cantidad de tiempo (y cuanto mayor sea el sitio, más tiempo se gana).
La indexación
El principio, por lo tanto, es el siguiente: tomar un texto (más o menos largo), extraer todas sus palabras, y registrar cada una de ellas en una base de datos, haciendo corresponder con cada palabra el lugar donde se encuentra.
Por ejemplo, tenemos un sitio con tres artículos, cuyos textos (muy cortos) son:
- artículo 1: «El gato pequeño ha muerto de frío y de hambre.»
- artículo 2: «El gato grande ha entrado en la casa.»
- artículo 3: «La casa protege del frío.»
Vamos a extraer las palabras de cada artículo, y grabar para cada palabra a qué artículo corresponde (no tomaremos más que las palabras de más de tres letras, luego explicaremos por qué):
- pequeño: 1
- gato: 1, 2
- muerto: 1
- frío: 1, 3
- hambre: 1
- grande: 1
- entrado: 2
- casa: 2, 3
- protege: 3
Y así sucesivamente, considerando que nuestro sitio ciertamente no es muy grande, ni los artículos muy largos.
Si se busca la palabra gato:
- una solución sin indexación consistiría en leer todos los artículos, para encontrar la palabra gato; en un sitio grande, hasta para un ordenador, esto requiere bastante tiempo;
- como tenemos un índice, basta consultar la entrada gato: se sabe inmediatamente que está en los artículos 1 y 2.
La ponderación
A la indexación se le añade un segundo principio: la ponderación. Se trata de intentar que el motor sea más pertinente. Supongamos, por ejemplo, que una palabra aparece en el título de un artículo y en el cuerpo del texto de otro artículo. Se considera que, cuando se busca esa palabra, es necesario indicar en primer lugar el artículo donde aparece en el título. Además, si una palabra aparece 25 veces en un artículo, y sólo dos veces en otro, hay que mostrar primero el artículo en el cual la palabra es más frecuente.
Como se ve, la indexación simple no es suficiente. Si se busca gato, se hallarán los artículos donde aparece, pero sin que después podamos clasificar esos artículos entre si (según que la palabra gato aparezca una vez o 20, o si se halla en el título o sólo en el texto...).
Por eso SPIP calculará una ponderación para cada palabra de cada artículo. Es decir, da puntos a esa palabra en función del lugar donde se halle, y del número de veces que aparezca:
en el título | 8 puntos |
en el subtítulo | 5 puntos |
en el antetítulo | 5 puntos |
en la descripción | 4 puntos |
en el epígrafe | 3 puntos |
en el texto | 1 punto |
en el post scríptum | 1 punto |
Si la palabra aparece varias veces, se suman las ocurrencias.
Por ejemplo, si en un artículo, la palabra gato aparece:
- una vez en el título : 8 puntos
- dos veces en la descripción: 2 veces 4 = 8 puntos
- seis veces en el texto: 6 veces 1 = 6 puntos
- total: 8 + 8 + 6 = 22 puntos.
Luego la palabra gato, en el índice, se guarda así:
- gato, en el artículo número X, 22 puntos;
- gato, en el artículo número Y, 15 puntos;
- ...
Si se busca la palabra gato, gracias al índice, sabremos entonces que se halla en los artículos X e Y, y además se puede clasificar esos artículos entre si: 22 puntos en X, 15 puntos en Y; luego se considera que el artículo X responde mejor a la consulta.
Las palabras-clave: bastantes usuarios confunden las palabras-clave con la indexación. Las palabras-clave, por construcción, no tienen nada que ver con la indexación: cuando SPIP efectúa una búsqueda, no consulta las palabras-clave asociadas con los artículos (lo que sería muy limitado), busca en el índice que ha creado a partir del texto exacto de los artículos. por lo tanto, en el propio principio de la indexación, las palabras-clave no intervienen en absoluto.
No obstante, las palabras-clave si que se utilizan para crear la ponderación de los artículos. Si hay una palabra-clave asociada con un artículo, esta entra en la indexación del propio artículo, con una fuerte ponderación (12 puntos para el nombre de la palabra-clave, 3 puntos para su descripción). Así, si nuestro artículo Y (15 puntos si sólo tenemos en cuenta su contenido) está asociado con la palabra-clave gato (porque con esta palabra se indica que es el asunto de ese artículo), hay que añadir en la indexación del artículo, para la palabra gato, los 12 puntos de la palabra-clave: en total 27 puntos. En nuestra consulta sobre gato, el artículo Y ahora supera al artículo X.
Destacamos, por fin, que todos los elementos de contenido de SPIP son objeto de una indexación: los artículos, las breves, las secciones, las autoras, las palabras-clave, los sitios referenciados (si el sitio es una sindicación, los títulos de los artículos recogidos en el sitio entran igualmente en la indexación).
¿Dónde se almacena?
Los datos de la indexación se guardan directamente en la base de datos. Esta parte es un poco técnica, así que no nos extenderemos mucho tiempo sobre el asunto.
Simplemente hay que saber que hay varios índices (listas de palabras), cada una de las cuales corresponde a un tipo de contenido (un índice para los artículos, un índice para las secciones, un índice para las breves...). Además, al contrario que en la explicación anterior, donde las entradas del índice son palabras, en SPIP las entradas de los índices son números calculados a partir de esas palabras (son hashes); con otra tabla de la base de datos que guarda por su lado la correspondencia entre las verdaderas palabras y sus números; este método permite acelerar las consultas en los índices (para el programa es más rápido buscar números que palabras).
Hay que fijarse sobre todo en que el tamaño de los índices es muy importante. En uZine, por ejemplo, la parte de la base de datos dedicada a almacenaje de los artículos pesa 9,7 Mb. La parte que guarda el índice correspondiente a los artículos pesa 10,5 Mb. Y la parte que guarda la correspondencia entre las palabras y su traducción en números 4,1 Mb. Así, para un sitio cuyos artículos ocupan 9,7 Mb, la indexación de los mismos representa, ella sola, casi 14,6 Mb. El espacio necesario para esos artículos y la búsqueda, por lo tanto, es más del doble del tamaño ocupado por el sitio. Especialmente, esta es una de las razones por las que se puede preferir desactivar el motor de búsqueda, si existen importantes limitaciones de espacio en el alojamiento web.
¿Qué palabras se indexan?
Como hemos visto, todas las palabras de todos los elementos de contenido del sitio se extraen, y luego se analizan (para su ponderación). Pero, SPIP no retendrá todas las palabras.
- Los códigos HTML se excluyen de la indexación. Esto es evidentemente necesario para obtener búsquedas «limpias»...
- Las palabras de menos de 4 letras no se retienen (en realidad, de menos de 3 letras; pero las palabras de 3 letras, de momento, no son utilizadas realmente en las consultas). Este punto produce bastantes preguntas por parte de los usuarios...
El problema es obtener resultados lo más pertinente posible. Por eso es necesario dar prioridad, en las búsquedas, a las palabras realmente importantes en el sentido de la consulta. Por ejemplo, si se buscan las palabras el gato, la palabra importante es gato, y no el...
Retomemos nuestro primer ejemplo (con tres artículos cada uno formado por una frase). Si se hubiesen indexado todas las palabras, tendríamos guardadas las palabras:
- el: 1, 2
- ha : 1, 2
- ...
Si buscamos las palabras el frío ha comenzado, encontramos las entradas:
- el: 1, 2
- frío: 1,3
- ha: 1, 2
- comenzado: ninguna parte.
Sumando los resultados de esas palabras para cada artículo (en realidad, la ponderación de cada artículo, pero vamos a considerar en nuestro ejemplo que cada palabra tiene una ponderación de un solo punto), se obtendría:
- artículo 1: 3 palabras
- artículo 2: 2 palabras
- artículo 3: 1 palabra.
Por lo tanto, la clasificación pondría en cabeza el artículo 1, luego el 2, y después el 3. Pero el artículo 2 no se refiere al frío, al contrario que el artículo 3. A causa del uso de palabras sin importancia para el sentido (el, ha), la clasificación se ha falseado.
De ahí la necesidad de que, en la indexación, no se tomen en cuenta las palabras que no formen parte del sentido de la búsqueda. El método más limpio consiste en darle al sistema una lista de palabras que no hay que indexar; sin embargo, eso requiere un trabajo enorme, es decir la constitución de diccionarios de exclusión (y esto en todos los idiomas)... Por eso, más simplemente, en SPIP elegimos considerar que las palabras de tres letras o menos no son «importantes»; evidentemente, hay errores, ya que palabras como cal, mar, sur... no se tienen en cuenta; luego esto es un compromiso, que se juzga por la eficacia de las consultas (que globalmente son de buena calidad).
N.B. Desde la versión 1.6 de SPIP, las siglas de dos letras o más, incluyendo las que contengan cifras (G8, CNT, PHP, ONU...), se indexan. Una sigla es una palabra que no contenga ninguna minúscula.
¿Cuando tiene lugar la indexación ?
La indexación se realiza en tres momentos diferentes:
- cuando validas un artículo, el mismo se indexa inmediatamente;
- cuando modificas un artículo ya publicado, el mismo es indexado de nuevo;
- cuando se visita el sitio público, si un elemento accesible al público no está indexado (por ejemplo, cuando acabas de borrar los datos de indexación desde el espacio privado, o si acabas de recuperar tu sitio desde una copia de respaldo - los índices no se guardan en ella -, o si has activado el motor de búsqueda después de que ya hayas publicado artículos), se indexa en ese momento (como tarea en segundo plano).
Recuerda que la operación de indexado es relativamente pesada: requiere numerosos cálculos (cálculos poco complejos, pero efectuados con todas las palabras del artículo), y causa un gran número de llamadas a la base de datos. Aquí también, con un alojamiento web muy lento (¡realmente muy lento!), puede ser preferible desactivar el motor de búsqueda.
Recuerda igualmente que, si activas el motor después de haber publicado ya artículos, estos no son indexados inmediatamente: serán las visitas al sitio público las que causen su indexación. En un sitio grande, esto puede tomar cierto tiempo.
La búsqueda
Cuando todos los documentos están indexados, podemos efectuar búsquedas.
Si buscas una sola palabra...
SPIP consultará el índice, y encontrará la entrada que corresponde a esa palabra. Para la palabra gato, habíamos hallado los artículos X e Y. SPIP además hallará el número de puntos atribuidos a esa palabra para cada artículo (22 puntos en X, y 27 puntos para Y). Así que podemos clasificar nuestros resultados: el artículo Y, y después el artículo X.
Si buscas varias palabras...
SPIP no autoriza construcciones de tipo «Y», «O», no funciona de ese modo.
Cuando buscas varias palabras, SPIP efectuará la operación de búsqueda para cada palabra, recupera los puntos para cada artículo (o breve, o sección, etc.), y suma esos puntos.
Busquemos por ejemplo las palabras gato, grande, casa. Se obtienen los resultados siguientes con cada palabra:
- gato: artículo X (22 puntos), artículo Y (27 puntos),
- grande: artículo X (12 puntos), artículo Y (2 puntos), artículo Z (5 puntos),
- casa: artículo Y (3 puntos), artículo Z (17 puntos).
SPIP hace la suma de todos esos puntos para cada artículo:
- artículo X: 22 + 12 = 34 puntos,
- artículo Y: 27 + 2 + 3 = 32 puntos,
- artículo Z: 5 + 17 = 22 puntos.
La clasificación de los artículos, para la consulta gato, grande, casa, es: el artículo X, luego el artículo Y, y después el artículo Z. (Por otra parte, en los esqueletos, se puede pedir que se muestren los puntos de cada resultado gracias a la baliza #POINTS
, ver el artículo Los bucles de búsqueda.)
Por lo tanto no es una búsqueda de tipo «Y» ni «O», es una adición de puntos. Y con el uso, resulta sobre todo eficaz (se encuentra lo que se busca, lo cual es precisamente el objetivo de un buscador...).