Le but de cette publication est d'apporter quelques éléments aux personnes qui souhaitent développer un moteur de recherche sur leur site. C'est un vaste sujet... Cependant le moteur de recherche proposé ici a le mérite d'être simple et assez efficace je pense.

INDEXATION DES RESSOURCES DU SITE
Tout d'abord on peut imaginer un site web comme un livre. C'est un ensemble de mots qui forment des phrases... Et comme dans tout bon bouquin, à la fin, on y trouve un index. Un index, c'est tout simplement les mots les plus importants et les pages où l'on peut les trouver.
Nous partons du principe que le site web à indexer est un site dynamique élaboré par exemple avec le couple bien connu php mysql.
L'ensemble des ressources du site est composé d'articles, d'actualités, de liens, ... stockés et identifiées dans des tables.
Deux tables permettent de gérer le moteur :
J'ai d'abord créé une table nommée dico, qui permet de stocker l'ensemble des mots du site et leur hash (voir google pour plus de détails sur les fonctions de hachage). La recherche sur le champ hash indexé donne de bons resultats en terme de performances dans mysql. J'ai ajouté un champ occurrence permettant de connaitre pour un mot donnée le nombre de fois qu'il a été indexé dans la base. Car il va falloir prévoir une liste des mots qui reviennent souvent comme : un de le la les des ... afin de les bannir du moteur.
#
# Structure de la table `dico`
#
CREATE TABLE dico (
hash varchar(32) NOT NULL default '',
mot varchar(32) NOT NULL default '',
occurrence int(11) NOT NULL default '0',
PRIMARY KEY (hash)
) TYPE=MyISAM;
Ensuite, j'ai créé une table faisant le lien entre le dictionnaire et les ressources du site grace au hash.
#
# Structure de la table `ldico`
#
CREATE TABLE ldico (
hash varchar(32) NOT NULL default '',
ressource varchar(5) NOT NULL default '',
num_int int(11) NOT NULL default '0',
score int(11) NOT NULL default '0',
KEY hash (hash),
KEY ressource (ressource),
KEY num_int (num_int)
) TYPE=MyISAM;
Cette table se compose de notre hash, du type de ressource vers lequel ce hash est utilisé (article, actualité...), un numéro de ressource et un champ score qui est incrementé à chaque fois qu'on retrouve un même mot au sein d'une même ressource. Ce score peut-être alimenté differement en fonction du "poids" que l'on souhaite donner aux mots (par exemple pour un mot dans un titre, on peut considerer un poids de 2 tandis qu'un mot dans le corps d'un article n'aura qu'un poids de 1, chacun peut choisir sa façon de pondérer les mots en fonctions de leur place dans le site).
Les fonctions PHP d'indexation sont disponibles dans les sources ci-dessous.

FONCTIONNEMENT DE LA RECHERCHE
Rechercher un mot c'est simple, car on va explorer la table ldico et afficher les ressources correspondantes par score décroissant.
Rechercher plusieurs mots est plus compliqué. j'ai developpé une algo maison qui donne des résultats pas trop mauvais :
Imaginons que la recherche se porte sur trois mots : mot1, mot2 et mot3. A partir de ces trois mots, on va générer une table temporaire sous forme de matrice symétrique de mots ?!? Kézako !?!
#
# Structure de la table `tempo`
#
CREATE TABLE tempo (
num_int int(11) NOT NULL default '0',
id varchar(50) NOT NULL default '',
var1 varchar(30) NOT NULL default '',
var2 varchar(30) NOT NULL default '',
var3 varchar(30) NOT NULL default '',
var4 varchar(30) NOT NULL default '',
var5 varchar(30) NOT NULL default '',
var6 varchar(30) NOT NULL default '',
var7 varchar(30) NOT NULL default '',
var8 varchar(30) NOT NULL default '',
var9 varchar(30) NOT NULL default '',
var10 varchar(30) NOT NULL default '',
KEY id (id),
KEY num_int (num_int)
) TYPE=MyISAM;
Si l'on reste dans notre exemple, la matrice ressemble à ceci :
mot1 mot2 mot3
mot3 mot1 mot2
mot2 mot3 mot1
C'est symétrique ! et cela nous donne toutes les combinaisons possibles que l'on peut faire en permutant les trois mots. Avec des mots comme "php", "mysql", "application", ce n'est pas choquant et la recherche ne perd pas vraiment de sens après permutation.
Ensuite, il suffit de faire des "boucles" sur la table temporaire et le nombre de mots à chercher, en évaluant d'abord les ressources qui possèdes tous les mots puis tous les mots moins un ... jusqu'à un seul mot.
Chaque resultat est encore un fois trié par score décroissant.
Cela fonctionne avec autant de mots que l'on veut, le principe reste le même. Attention, j'ai limité ici la table à 10 mots (var1, var2 .., var10).
Les sources ci-dessous donnent le détail des fonctions en PHP.

LES LIENS :