Sommaire | Email |
  Tutoriaux

Un petit moteur de recherche en PHP

Introduction

PHP est le langage rêvé pour développer un petit moteur de recherche pour un site web. En effet le fonctionnement d'un moteur de recherche est très simple: il cherche la chaine fournie par l'utilisateur dans une base de donnée et affiche les résultats obtenus. On peut par exemple imaginer créer un moteur de recherche pour un site de vente en ligne dans lequel il suffirait de taper le nom d'un artiste pour voir apparaître la liste de ces disques. (Cet exemple vaut ce qu'il vaut :o) .

La théorie

Passons maintenant à quelque chose de plus concret. Nous allons voir comment fonctionne un moteur de recherche.

La base

Pour effectuer une recheche dans une base de données, il "suffit" d'éxecuter la requete SQL suivante :
SELECT * from MaTable where  Champs=cequejecherche

Prenons un exemple : ma table a la structure suivante :
ID Groupe Titre
1 RATM The Battle of LA
2 Silverchair Neon Balroom
3 SilverHawk Aigles D'argent

Nous récupérons donc les champs Titres pour lesquel Champs=silverchair, nous obtenons donc Neon Balroom .
C'est la forme la plus simple de moteur de recherche, en effet il ne retournera que les occurences exactes. Pour créer un moteur de recherche plus évolué, il suffit d'utiliser une requête SQL plus recherchée :
SELECT * from MaTable where Champs LIKE %cequejecherche%
Cette requete retourne les enregistrements dont le champs Champs contient la chaine cequejecherche. (En SQL % est un caractère "joker"). Si on éxécute la requete suivante dans notre table :
SELECT Titre from MaTable where  Champs LIKE %silver%
On obtient deux titres : Frogstomp et Untitled. Nous voilà avec un joli moteur de recherche. Mais celui-ci possède également un très gros défaut : il n'effectué sa recherche que sur une chaine. Il serait interressant de pouvoir faire une recherche sur plusieur chaine.

Un peu plus de complexité

Ce que je propose, c'est d'éclater la chaine en autant de chaine que de mots la composant.
La chaine recherchée est stockée dans la variable $recherche, $operateur corespond à une variable prenant la valeur AND ou OR. Cette variable nous permet de spécifier le type de recherche désirée. OR si il faut trouver au moins 1 des mots, ou un AND si il faut absolument tous les mots.
$recherche=strtolower($recherche);                          // on passe les mots recherchés en minuscules   
$mots = str_replace("+", " ", trim($recherche)); // on remplace les + par des espaces $mots = str_replace("\"", " ", $mots); // on remplace les " par des espaces $mots = str_replace(",", " ", $mots); // on remplace les , par des espaces $mots = str_replace(":", " ", $mots); // on remplace les : par des espaces $tab=explode(" " , $mots); // on place les differents mots dans un tableau $nb=count($tab); // on compte le nbr d'élément du tableau. $sql="select * from search where mot_cles like \"%$tab[0]%\" "; //on prépare la requête SQL. for($i=1 ; $i<$nb; $i++) { $sql.="$operateur mot_cles like \"%$tab[$i]%\" "; // on boucle pour integrer tous les mots dans la requête } mysql_connect($host,$user, $passwd); // on se connecte au serveur $result = mysql_db_query($db,$sql); // on execute la requête SQL. if($result) { if(mysql_num_rows($result)==0) echo "<center><b>Pas de Résultat</b></center>
"; //si il n'y a pas de résultats else { echo "<center><b>Résultat(s)</b></center><br>"; while($row = mysql_fetch_array($result)) { echo $row["titre"]; $url = $row["url"]; echo " | < a href=\"$url\">$url</a>
"; } mysql_free_result($result); } } echo "La requete SQL execute est : $sql" ;
Nous avons réussi à coder un petit moteur de recherche fonctionnel vous permettant d'indexer des liens ou des resources sur votre sites web personnel.

Le raffinement: l'affichage

Le problème avec le code précedent c'est que si nous avons 100 réponse à notre requête, les 1OO réponses vont êtres affichées sur la même page. Ceci est loin d'être pratique. Je vous propose de faire en sorte que notre moteur de recherche affiches les résultats comme les grands que sont voilà ou altavista, c'est à dire 10 réponses par pages et des petits liens permettants de passer d'une page à l'autre.
Pour réaliser l'interface de navigation, il faut d'abord choisir combien de réponse nous voulons par pages. Nous choisirons ici 10. Ce paramêtre sera à ajouter dans notre fichier de configuration.
$limit=10;

Un peu de théorie.

Pour obtenir seulement un nombre restreint de résultat par page, il va falloir modifier notre requete sql de la facon suivante :
select  from search where mot_cles like %larecherche% limit $debut,$limit;
Cette requete selectionne les lignes de la table où mots_cles comporte un occurence de larecherche et ne renvois qu'un $limit nombre de lignes en partant de $debut. En plus clair si nous avons résultats et que $debut= 10 et $limit =5, mysql nous renvois les resultats 10 11 12 13 15.

Pour pouvoir réaliser cette fonction, il faut donc savoir combien il y a de résultats à notre recherche. Ce nombre correspond en fait au nombre de ligne du tableau résultat renvoyé par mysql : $nrows=mysql_num_rows($result); //nombre de résultat La deuxieme donnée à obtenir est le nombre de pages nécessaires pour afficher tous les résultats. Pour cela on fait
$nombre=ceil($nrows/$limit);
int ceil(number) retourne l'entier supérieur du nombre number. En effet on ne peut pas avoir un nombre de page à virgule :) Le dernier paramêtre à récupérer est $debut, qui correspond au numéro de résultat a partir duquel on commence l'affichage. On passera tous ces paramêtres dans l'url.

On obtient donc le code suivant :
if($debut>0)
{
echo  "<a href=search.php3?recherche=$recherche&operateur=$operateur&debut=".($debut-$limit)."><<</a>  ";
}

if ($nombre>1)
{
for($i=1; $i<=$nombre; $i++)
    {
    echo "<a href=search.php3?recherche=$recherche&operateur=$operateur&debut=".(($i-1)*$limit).">".$i."</a> ";
    }
}
if(($debut+$limit)<$nrows)
{
echo "<a href=search.php3?recherche=$recherche&operateur=$operateur&debut=".($debut+$limit).">>></a>";
}

Conclusion

Et voilà nous avons maintenant un moteur de recherche digne de ce nom. (pas vrai JP! :)
Vous n'avez plus qu'a l'adapter à vos besoins.
Vous pouvez consulter le code complet ici , voir un exemple ici ou télécharger l'archive complete ici(zip) ou (tar.gz).


v0.3 22 septembre 2000 12:52:17 Grégory KOKANOSKY pour phpinfo.net

Valid XHTML 1.0! Valid CSS!