Comment fonctionne le moteur de recherche de SPIP ?

Le moteur de recherche intégré à SPIP est très simple d’utilisation, et cependant relativement puissant. Même si la plupart des utilisateurs n’ont aucune raison de se demander « comment ça marche ? », nombreux sont les courriers qui demandent des précisions sur son fonctionnement...

Voici les principes sur lesquels repose le moteur de SPIP.

Afin d’être rapide et efficace (c’est-à-dire pour qu’il donne des réponses pertinentes), le moteur de SPIP utilise un système d’indexation des contenus. L’indexation consiste à analyser tous les textes contenus dans SPIP, à en extraire tous les mots, et à sauvegarder pour chaque mot l’endroit où il apparaît.

Comme l’index dans un livre vous présente les mots importants du livre, suivis des numéros des pages où les retrouver, l’index du moteur de recherche fait correspondre à chaque mot utilisé sur le site le numéro de l’article, de la brève... où le retrouver.

Ensuite, lorsqu’on utilise le moteur pour effectuer une recherche, SPIP n’a plus besoin de consulter l’ensemble des textes du site, mais simplement d’aller consulter l’index pour savoir où se trouvent ces mots. On gagne ainsi énormément de temps (et plus le site est gros, plus on gagne de temps).

L’indexation

Le principe est donc le suivant : prendre un texte (plus ou moins long), en extraire tous les mots, et noter chacun de ces mots dans une base de données, en faisant correspondre ce mot à l’endroit où il se trouve.

Par exemple, notre site a trois articles, dont les textes (très courts) sont :
-  article 1 : « Le petit chat est mort de froid et de faim. »
-  article 2 : « Le gros chat est rentré à la maison. »
-  article 3 : « La maison résiste au froid. »

Nous allons extraire les mots de chaque article, et enregistrer pour chaque mot à quel article il correspond (nous ne prendrons que les mots de plus de trois lettres, nous expliquerons plus loin pourquoi) :
-  petit : 1
-  chat : 1, 2
-  mort : 1
-  froid : 1, 3
-  faim : 1
-  gros : 1
-  rentré : 2
-  maison : 2, 3
-  résiste : 3

Et ainsi de suite, en considérant que notre site est certainement beaucoup plus gros, et les articles beaucoup plus long.

Si l’on recherche le mot chat :
-  une solution sans indexation consisterait à relire tous les articles, pour y trouver le mot chat ; sur un gros site, même pour un ordinateur, cela prend beaucoup de temps ;
-  puisque nous avons un index, il suffit de consulter l’entrée chat : on sait immédiatement qu’il se trouve dans les articles 1 et 2.

La pondération

À l’indexation s’ajoute un deuxième principe : la pondération. Il s’agit d’essayer de rendre le moteur plus pertinent. Par exemple, si un mot apparaît dans le titre d’un article, et dans le corps du texte d’un autre article, on considère que si l’on recherche ce mot, il faut en premier indiquer celui où il apparaît dans le titre. De plus, si un mot apparaît 25 fois dans un article, et seulement deux fois dans un autre, on veut afficher en premier l’article où le mot est le plus fréquent.

On voit que l’indexation simple ne suffit pas. Si on recherche chat, on trouvera les articles où il apparaît, mais sans pouvoir ensuite classer ces articles entre eux (selon que le mot chat apparaît une fois ou 20 fois, ou s’il se trouve dans le titre ou seulement dans le texte...).

SPIP va donc calculer une pondération pour chaque mot dans chaque article. C’est-à-dire donner des points à ce mot en fonction de l’endroit où il se trouve, et du nombre de fois où il apparaît :

dans le titre 8 points
dans le soustitre 5 points
dans le surtitre 5 points
dans le descriptif 4 points
dans le chapo 3 points
dans le texte 1 point
dans le post-scriptum 1 point

Si le mot apparaît plusieurs fois, on additionne les occurences.

Par exemple, si dans un article, le mot chat apparaît :
-  une fois dans le titre : 8 points
-  deux fois dans le descriptif : 2 fois 4 = 8 points
-  six fois dans le texte : 6 fois 1 = 6 points
-  total : 8 + 8 + 6 = 22 points.

Le mot chat, dans l’index, est donc ainsi enregistré :
-  chat, dans l’article numéro X, 22 points ;
-  chat, dans l’article numéro Y, 15 points ;
-  ...

Si l’on recherche le mot chat, grâce à l’index, on saura donc qu’il se trouve dans les articles X et Y, et de plus on peut classer ces articles entre eux : 22 points dans X, 15 points dans Y, donc on considère que l’article X répond mieux à la recherche.

Les mots-clés : beaucoup d’utilisateurs confondent les mots-clés et l’indexation. Les mots-clés n’ont, par nature, aucun rapport avec l’indexation : quand SPIP effectue une recherche, il ne recherche pas dans les mots-clés associés à des articles (ce serait très limité), il recherche dans l’index qu’il a fabriqué à partir du texte exact des articles. Donc, dans le principe même de l’indexation, les mots-clés n’interviennent pas du tout.

En revanche, les mots-clés sont tout de même utilisés pour fabriquer la pondération des articles. Si un mot-clé est associé à un article, il entre alors dans l’indexation de l’article lui-même, avec une forte pondération (12 points pour le nom du mot-clé, 3 points pour son descriptif). Ainsi, si notre article Y (15 points en prenant simplement compte son contenu propre) est associé au mot-clé chat (parce qu’on indique par ce mot que c’est le sujet de cet article), il faut ajouter à l’indexation de cet article, pour le mot chat, les 12 points du mot-clé : total 27 points. Dans notre recherche sur chat, l’article Y devance désormais l’article X.

Notons enfin que tous les éléments de contenu de SPIP font ainsi l’objet d’une indexation : les articles, les brèves, les rubriques, les auteur, les mots-clés, les sites référencés (si le site est une syndication, les titres des articles récupérés sur ce site entrent également dans l’indexation).

Où est-ce stocké ?

Les données de l’indexation sont directement stockées dans la base de données. Cette partie est un peu technique, aussi je ne m’étendrai pas longtemps sur le sujet.

Sachez simplement qu’il y a plusieurs index (listes des mots), correspondant chacun à un type de contenu (un index pour les articles, un index pour les rubriques, un index pour les brèves...). De plus, contrairement à l’explication ci-dessus, où les entrées de l’index sont des mots, dans SPIP les entrées des index sont des nombres calculés à partir de ces mots (des hachages) ; une autre table de la base de données stockant par ailleurs les correspondance entre les véritables mots et ces nombres ; cette méthode permet d’accélérer les recherches dans les index (il est plus rapide pour le logiciel de rechercher des nombres plutôt que des mots).

Notez surtout que la taille des index est très importante. Sur uZine, par exemple, la partie de la base de données consacrée au stockage des articles pèse 9,7 Mo. La partie qui stocke l’index correspond aux articles pèse 10,5 Mo. Et la partie qui stocke la correspondance entre les mots et leur traduction en nombres 4,1 Mo. Ainsi, pour un site dont les articles occupent 9,7 Mo, l’indexation de ces articles représente, à elle seule, près de 14,6 Mo. L’espace nécessaire à ces articles et à la recherche a donc plus que doublé la taille occupée par le site. C’est l’une des raisons, notamment, pour lesquelles on peut préférer désactiver le moteur de recherche, si l’on a d’importantes limitations en matière d’hébergement.

Quels mots sont indexés ?

Nous l’avons vu, tous les mots de tous les éléments de contenu du site sont extraits, puis analysés (pour pondération). Cependant, SPIP ne va pas retenir tous les mots.

-  Les codes HTML sont exclus de l’indexation. Cela est évidemment nécessaire pour obtenir des recherches « propres »...

-  Les mots de moins de 4 lettres ne sont pas retenus (en réalité, de moins de 3 lettres, mais les mots de 3 lettres ne sont pour l’instant pas exploités réellement lors des recherches). Ce point soulève beaucoup de questions de la part des utilisateurs...

Le problème est d’obtenir des résultats aussi pertinents que possible. Il faut donc privilégier, dans les recherches, les mots réellement importants dans le sens de la recherche. Par exemple, si l’on recherche les mots le chat, le mot important est chat, et non le...

Reprenons notre premier exemple (avec trois articles constitués chacun d’un phrase). Si l’on avait indexé tous les mots, nous aurions notamment les mots :
-  le : 1, 2
-  est : 1, 2
-  ...

En recherchant les mot le froid est dangereux, nous trouverions les entrées :
-  le : 1, 2
-  froid : 1,3
-  est : 1, 2
-  dangereux : nulle part.

En ajoutant les résultats de ces mots pour chaque article (en réalité, la pondération de chaque article, mais considérons pour notre exemple que chaque mot a une pondération d’un seul point), on obtiendrait :
-  article 1 : 3 mots
-  article 2 : 2 mots
-  article 3 : 1 mot.

Le classement mettrait donc en tête l’article 1, puis l’article 2, puis l’article 3. Or, l’article 2 ne parle pas de froid, contrairement à l’article 3. À cause de l’utilisation des mots sans importance pour le sens (le, est), le classement est faussé.

D’où le besoin, dans l’indexation, de ne pas tenir compte des mots qui n’entrent pas dans le sens de la recherche. La méthode la plus propre consiste à fournir au système une liste de mots à ne pas indexer ; cependant, cela nécessite un travail énorme, c’est-à-dire la constitution de dictionnaires d’exclusion (et cela dans toutes les langues)... Donc, plus simplement, dans SPIP nous choisissons de considérer que les mots de trois lettres et moins ne sont pas « importants » ; évidemment, il y a de la casse, puisque des mots comme Val, mer, sud... ne sont plus pris en compte ; c’est donc un compromis, qui se juge sur l’efficacité des recherches (qui sont globalement de bonne qualité).

N.B. Depuis la version 1.6 de SPIP, les sigles de deux lettres et plus, y compris ceux contenant des chiffres (G8, CNT, PHP, ONU...), sont indexés. Un sigle est un mot ne comprenant aucune minuscule.

Quand a lieu l’indexation ?

L’indexation a lieu à trois moments différents :

-  lorsque vous validez un article, celui-ci est immédiatement indexé ;

-  lorsque vous modifiez un article déjà publié, il est à nouveau indexé ;

-  lors de la visite du site public, si un élément accessible au public n’est pas indexé (par exemple, lorsque vous venez d’effacer les données d’indexation depuis l’espace privé, ou lorsque vous venez de rétablir une sauvegarde de votre site - les index ne sont pas sauvegardés -, ou si vous avez activé le moteur de recherche après avoir déjà publié des articles), alors il est indexé (en tâche de fond).

Retenez que l’opération d’indexation est relativement lourde : elle demande de nombreux calculs (calculs peu complexes, mais effectués sur tous les mots de l’article), et provoque de très nombreux appels à la base de données. Là aussi, chez un hébergeur très lent (vraiment très lent !), il peut être préférable de désactiver le moteur de recherche.

Retenez également que, si vous activez le moteur après avoir déjà publié des articles, ceux-ci ne sont pas immédiatement indexés : ce seront les visites sur le site public qui provoqueront leur indexation. Sur un gros site, cela peut prendre un certain temps.

La recherche

Puisque tous les documents sont indexés, on peut désormais effectuer des recherches.

Si vous recherchez un seul mot...

SPIP va consulter l’index, et trouver l’entrée correspond à ce mot. Pour le mot chat, nous avions trouvé les articles X et Y. SPIP va de plus récupérer le nombre de points attribués à ce mot pour chaque article (22 points dans X, et 27 points pour Y). On peut donc classer nos résultats : l’article Y, puis l’article X.

Si vous recherchez plusieurs mots...

SPIP n’autorise pas les constructions du type « ET », « OU », il ne fonctionne pas de cette manière.

Lorsque vous recherches plusieurs mots, SPIP va effectuer l’opération de recherche pour chaque mot, récupérer les points de chaque article (ou brève, ou rubrique, etc.), et ajouter ces points.

Recherchons par exemple les mots chat, gros, maison. On obtient les résultats suivants pour chaque mot :
-  chat : article X (22 points), article Y (27 points),
-  gros : article X (12 points), article Y (2 points), article Z (5 points),
-  maison : article Y (3 points), article Z (17 points).

SPIP fait l’addition de tous ces points pour chaque article :
-  article X : 22 + 12 = 34 points,
-  article Y : 27 + 2 + 3 = 32 points,
-  article Z : 5 + 17 = 22 points.

Le classement des articles, pour la recherche chat, gros, maison, est : article X, puis article Y, puis article Z. (Dans les squelettes, on peut d’ailleurs demander l’affichage des points de chaque résultat grâce à la balise #POINTS, voir l’article « Les boucles et balises de recherche ».)

Ca n’est donc pas une recherche de type « ET » ni « OU », c’est une addition de points. Et à l’usage, cela se montre plutôt efficace (on trouve ce que l’on cherche, ce qui est bien le but d’un moteur...).

En savoir plus

-  Les jointures SQL utilisées pour la recherche sont définies dans la déclaration PHP des objets. Voir API de déclaration d’objets éditoriaux
-  Voir aussi le pipeline rechercher_liste_des_champs

Auteur L’équipe de SPIP Publié le : Mis à jour : 01/07/23

Traductions : català, English, Español, français, italiano, Nederlands