Accueil du site > SPIP, système de publication pour l’internet > Guide du webmestre et du bidouilleur SPIP > Le moteur de recherche

Le moteur de recherche

vendredi 15 juin 2001,

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.

SPIP | | Plan du site | Suivre la vie du site RSS 2.0
Habillage visuel © Marcimat (CSS sous Licence GNU/GPL) / Jek a go go (Pictures sous Licence cc-nc-nd)