Environnement iSeries

Le moteur de recherche.

dimanche 8 août 2004, par David Malle


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, en termes de rapidité, mais aussi de pertinence ou d’enrichissements divers (indexation de documents extérieurs au site, création de champs sémantiques permettant de proposer des recherches plus fines, etc.).

L’avantage du moteur interne, cependant, c’est qu’il permet de gérer l’affichage des résultats à travers les mêmes méthodes (squelettes) que le reste des pages de SPIP, et à l’intérieur du même environnement visuel.

L’indexation

L’indexation est réalisée lors des visites du site public. 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, SPIP attend qu’une page soit affichée en utilisant le cache [1].

L’indexation traite une à une 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’occurrences. 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 translittérés (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.

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. Pour mieux visualiser la dynamique d’indexation du site, vous pouvez ouvrir le fichier ecrire/data/spip.log, ou encore regarder la page ecrire/admin_index.php3 (nota : cette page, encore expérimentale, n’est pas livrée avec toutes les versions de SPIP, et n’existe qu’en français).

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 (sauf sigles), et translittération.

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 (par pointsinverse), 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’un site comme Le Courrier des Balkans comporte, à la date d’écriture de ce texte, environ 3 800 articles publiés, et plus de 7500 messages de forum, 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.

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.

La recherche n’offre pas d’opérateurs booléens, l’opérateur implicite étant grosso modo un « OU » logique. Cependant, depuis SPIP 1.7.1, les articles trouvés s’affichent dans un ordre qui privilégie les résultats contenant le plus de mots orthographiés précisément selon la requête. Ainsi, une requête sur « la main rouge » mettra en évidence les articles contenant « main » et « rouge », loin devant les articles ne contenant que « maintenance » ou « rouget » - ceux-ci apparaîtront, mais plus loin dans le classement.

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.  [1]

Notes

[1] Extrait de la documentation de SPIP.

[Xdocs, conduite de projet, as400, iseries, i5 V2.2]  Environnement iSeries  ©copyright - david malle, 2003-2007