racine uZine

Dans la même rubrique
Guide du webmestre et du bidouilleur SPIP
23 septembre 2001
2 juillet 2001
 
vendredi 15 juin 2001

Le moteur de recherche

par l’équipe de SPIP
 

SPIP intègre un moteur de recherche désactivé par défaut. Ce moteur, lorsqu’il
est activé par un administrateur dans la page de configuration, permet
d’effectuer des recherches sur différents types d’informations présentes
dans la base de données : les articles,
les rubriques, les brèves, les mots-clés et les auteurs.

Principe

Il y a deux grandes façons de faire un moteur de recherche. La première
est de chercher tout bêtement dans le type de stockage existant (fichiers
HTML, base de données... selon le type de site). Cette méthode est très
lente car le type de stockage n’est pas prévu à cet effet.

La seconde méthode, qui a été choisie pour SPIP (et qui est aussi celle
de tous les moteurs professionnels), est d’établir un mode de stockage
spécifique aux besoins de la recherche. Par exemple, le score de chaque mots
d’un article peut être stocké directement afin d’être facilement retrouvé,
et d’avoir le score total d’une recherche par une simple addition.
L’avantage est que la recherche est très rapide : presque aussi
rapide que n’importe quel calcul de page. L’inconvénient
est qu’il faut une phase de construction du dit stockage des informations :
cela s’appelle l’indexation. L’indexation a un coût en termes de ressources
(temps de calcul et espace disque), et elle introduit également un léger décalage
temporel entre l’ajout ou la modification d’un contenu, et
la répercussion
de cet ajout ou de cette modification sur les résultats de recherche.

D’autre part, dans le cas de SPIP, nous sommes obligés d’utiliser PHP et MySQL comme pour le reste du logiciel, ce qui ne permet pas de
réaliser un moteur très performant. C’est pourquoi le moteur est
désactivé par défaut : il risque de ralentir quelque peu votre site (voir
plus loin au chapitre performances pour des indications plus précises),
et il sera avantageusement
remplacé par un vrai moteur si vous avez la possibilité d’en
installer un (si oui, vous pouvez par exemple utiliser ht ://Dig, un moteur en logiciel libre).

L’indexation

L’indexation est réalisée selon deux modalités différentes :

1. Si un contenu (article, brève...) est publié ou modifié depuis
l’espace privé, alors il est réindexé immédiatement afin de tenir
les données à jour.

2. Lors de la visite d’un contenu dans le site public, ce contenu
est réindexé uniquement s’il n’a pas déjà été indexé. Pour être
plus précis (mais ça ne change rien au principe général), SPIP
attend qu’une page soit affichée en utilisant le
cache, afin d’éviter que le cumul d’une indexation et d’un calcul
de page ne mène à un timeout sur les serveurs particulièrement lents.

Le deuxième cas est là pour assurer que, si vous activez le moteur
de recherche sur un site déjà rempli, les anciens contenus seront également pris en compte par le moteur ; de même si vous restaurez une sauvegarde
(les données d’indexation ne sont pas incluses dans les sauvegardes pour des raisons d’espace disque).

L’indexation traite un à un les différentes données textuelles d’un
contenu donné : par exemple, pour un article, le chapo, le descriptif,
le titre, le texte... Pour chaque donnée textuelle, le score de chaque mot
est calculé en comptant simplement le nombre d’occurences. A cet effet,
les mots de trois caractères ou moins sont ignorés (ils sont, pour la plupart, non significatifs, et alourdiraient la base de données) ; d’autre part, les caractères accentués sont convertis en leurs équivalents non-accentués, pour éviter les problèmes de jeux de caractères et aussi pour permettre d’effectuer
des recherches en version non accentuée (en cas de clavier inadapté...).
Ensuite, les scores de chaque mot sont cumulés, de façon pondérée, entre
les différentes données textuelles du contenu indexé. La pondération permet,
par exemple, de donner plus de poids aux mots présents dans le titre d’un
article que dans le corps du texte ou le post-scriptum...

Les fonctions d’indexation peuvent être étudiées au sein du fichier
ecrire/inc_index.php3.

Dans la version [SPIP 1.6], d’importantes modifications ont été apportées au comportement du moteur :
- meilleur comportement dans un environnement multilingue ;
- le tiret bas (underscore) n’est plus considéré comme un séparateur de mot, mais comme un caractère alphabétique (utile pour de la documentation informatique) ;
- les mots de deux lettres (et plus) ne contenant que des majuscules et des chiffres sont considérés comme des sigles, et sont indexés, ce qui supprime l’un des principaux inconvénients de la limitation de l’indexation aux mots de plus de 3 lettres (G8, CNT, ONU sont désormais indexés).

La recherche

La recherche s’effectue simplement en séparant le texte de recherche
en ses différents mots ; le même filtre est appliqué que lors de
l’indexation : suppression des mots de trois lettres ou moins, et conversion
des caractères accentués. Pour chaque contenu recherché, le score
des différents mots est ensuite récupéré puis additionné afin d’obtenir
le score total. Enfin, les résultats sont en général affichés par ordre
décroissant de score, c’est-à-dire de pertinence (mais cela est laissé
à la volonté de la personne qui écrit les squelettes de mise en page).

Performances

Rapidité

Sur un serveur récent et pas trop chargé, l’indexation d’un texte long
(plusieurs dizaines de milliers de caractères) prendra entre une et deux
secondes : l’attente est presque imperceptible, comparée aux délais de
chargement via le réseau. Les contenus courts sont indexés de façon
quasi-instantanée. Bien sûr, ces affirmations doivent être modulées
selon la taille du site. Un site vraiment très gros risque de voir les
temps d’indexation s’allonger légèrement ; pour relativiser, signalons
qu’uZine comporte, à la date d’écriture de ce texte,
environ 400 articles et 400 brèves publiés, et que le
moteur de recherche de SPIP ne donne aucun signe de faiblesse.

Par ailleurs, statistiquement, on peut considérer de façon
approximative que chaque
contenu ne sera indexé qu’une seule fois : compte tenu qu’il y a en général
beaucoup plus de visites sur un site que de mises à jour de contenus, le surcroît
de charge du serveur apparaît négligeable (sauf en cas de machine très lente).

Qualité

La qualité de l’indexation est plus faible que sous des moteurs de recherche
professionnels. PHP étant un langage plutôt lent, la phase d’extraction des
mots a dû être simplifiée au maximum pour que les temps d’indexation
restent minimes. Par conséquent, les données d’indexation comportent quelques
« déchets », c’est-à-dire des morceaux de texte qui ne correspondent pas à
de « vrais » mots, mais ont été indexés comme tels (il s’agit souvent de
contenus techniques comme des noms de fichiers, ou de passages à la ponctuation
malmenée). L’exemple d’uZine (où l’on constate environ 2 % de tels « déchets »)
nous laisse cependant penser que ces données sont quantité négligeable,
d’autant qu’il y a peu de chance qu’elles déclenchent un résultat positif
lors d’une recherche.

Quant à la recherche, elle est simplement additive : il n’y a pas d’opérateurs booléens,
l’opérateur implicite étant grosso modo un « OU » logique. D’autre part,
le fait que les mots de trois lettres ou moins soient ignorés peut vous
gêner si vous avez des besoins spécifiques (beaucoup de sigles, d’abbréviations...).

Espace disque

MySQL n’étant pas spécialement conçu pour le stockage de données
d’indexation, l’utilisation du moteur de recherche a tendance à faire
beaucoup grossir l’espace disque utilisé par la base de données.
Pour donner quelque précision, disons qu’un contenu génère des
données d’indexation de taille comprise entre la taille du contenu et le
double de celle-ci. Donc, si l’on fait abstraction des données ne donnant
pas lieu à indexation (les forums par exemple), l’indexation fait entre
doubler et tripler la place prise par la base de données. Cela peut être
gênant si la place vous est très comptée.

Si jamais vous désactivez le moteur de recherche afin d’économiser
de l’espace disque, n’oubliez pas ensuite d’effacer les données d’indexation
(dans la page de sauvegarde/restauration de la base de données)
afin de réellement libérer l’espace disque occupé par ces données.

 
 
l’équipe de SPIP
Imprimer
format impression
l’équipe de SPIP
1er juin 2001
3 mai 2001
 
SPIP
Web indépendant