TUTORIELS 

Cas pratique : un moteur de recherche en Php.
Seconde partie : Interface et poids des mots(2/2)
Dans cette seconde partie de notre série consacrée à un "moteur de recherche" en Php, nous améliorons la gestion du poids des mots et offrons une "interface" d'indexation à notre moteur.  (23 janvier 2002)
 

Pages 1 | 2


Repérage des mots inclus dans les balises <TITLE></TITLE>

Nous allons, une fois encore, profiter d'un script déjà existant dans la bibliothèque de Nexen.net, tout en l'adaptant à nos besoins.

A l'origine ce script ouvre un fichier et récupère, lorsque c'est possible, le contenu des balises <TITLE></TITLE>, via l'utilisation de la fonction eregi(). Celle-ci est semblable à la fonction ereg() à ceci près qu'elle ne tient pas compte de la casse.

Ces fonctions permettent de retrouver dans une chaîne de caractères les séquences de caractères désignées par une expression régulière (Pour plus d'informations sur les expressions régulières, reportez-vous à ce tutoriel qui les utilise).

Après modification, il ne reste dans notre cas que la première ligne suivante :

if (eregi("<TITLE>(.*)</TITLE>", $str_ini, $regs))
{
     $str_titre = split_words($regs[1]);
     // On obtient un tableau de mots
     $nb_titre = count($str_titre);

     for($j=0;$j<$nb_titre;$j++)
     {
          $str_tmp = strip_tags($str_titre[$j]);
          $str_tmp = strtolower($str_tmp);
          $str_tmp = htmlspecialchars($str_tmp, ENT_QUOTES);

          // Suite des traitements Php...
     }
}

La fonction eregi() lorsqu'elle est couplée à un troisième paramètre, permet de récupérer le contenu de ce qui a été trouvé dans un tableau, ici regs[1] contient ce que nous cherchons. Le "1" correspond au contenu de la première parenthèse contenant le masque de recherche, ici "(.*)".

Nous avons donc récupéré le titre de notre page HTML, dans une chaîne de caractères, il nous faut maintenant, comme lors de la première étape d'indexation, découper mot à mot ce résultat.
Nous appliquons donc les mêmes fonctions qu'à l'étape précédente afin d'encoder les mots du titre de la même manière que leurs homologues contenus dans le corps du texte.

Dernière étape (du jour) : gérer le poids des mots issus du titre.

Le principe à adopter ici est le suivant : comme nous l'avions stipulé lors du premier tutoriel, lorsqu'un mot est contenu dans le titre, nous estimons qu'il "pèse" plus lourd qu'un "simple" mot contenu dans le corps du texte. Aussi, nous avons décidé (mais libre à vous de faire autrement), d'ajouter systématiquement, pour tout mot issu des balises <TITLE></TITLE> l'équivalent de 10 occurences supplémentaires.

Etant donné que cette opération intervient après l'indexation du fichier, il y a de bonnes chances pour que les mots du titre soient déjà indexés. Il faut donc retrouver le poids (le nombre d'occurences) qu'il possède déjà, et augmenter celui-ci de 10 unités.
Si le mot n'existe pas déjà dans la base, on le crée avec un poids initial de 10.

Nous reprenons la boucle "for" précédente en lui ajoutant le code correspondant :

//On tente de récupérer le poids associé au mot traité
$req_poids="select poids from moteur where mot = '$str_tmp'";
$idreq=mysql_query($req_poids);
if ($idreq == 0)
{
     echo("erreur recup poids<br>");
     mysql_close($idconnect);
     exit;
}

//Si le mot existe déjà, on ajoute 10 à son poids
if (mysql_num_rows($idreq) != 0)
{
     while ($row=mysql_fetch_array($idreq))
     {
          $poids_titre = $row[poids];
     }

     $poids_titre = $poids_titre + 10;

     // Mise à jour du poids du mot concerné
     $req_upd="update moteur set poids = $poids_titre where mot = '$str_tmp'";
     $idreq_upd=mysql_query($req_upd);
     if ($idreq_upd == 0)
     {
          echo("erreur maj poids<br>");
          mysql_close($idconnect);
          exit;
    }
}


Rien de sorcier ici, nous appliquons uniquement les principes dictés précedemment.

Il nous reste enfin à mettre à jour le champ "titre_page" de la table "moteur". Nous récupérons le contenu de la variable $regs[1] dans lequel se trouve le titre (nous l'avons expliqué en début de page). La requête à appliquer est donc la suivante :

// Mise à jour du titre
$req_titre="update moteur set titre_page = '$regs[1]'";
$idreq_titre=mysql_query($req_titre);
if ($idreq_titre == 0)
{
     echo("erreur maj titre<br>");
     mysql_close($idconnect);
     exit;
}

Si ces morceaux de code vous paraissent un peu décousus, c'est normal, aussi nous concluerons ce tutoriel avec l'intégralité du script Php, commenté. Il reprend l'intégralité de ce que nous avons vu jusqu'à maintenant.
Nous vous rappelons que le script de création de la table "moteur" se trouve dans le tutoriel précédent.
Afin que tout soit complet et que vous puissiez tester le tout chez vous, voici également le fichier HTML du tutoriel sur lequel nos tests sont effectués jusqu'à présent.

Au menu de la prochaine étape : la récursivité lors de la recherche de fichiers à indexer (entre autres).


Pages 1 | 2

 
[ Arnaud GadalJDNet
 
Accueil | Haut de page