phpInfo.netLes ArchivesLes éléPHPants

  
  Accueil
  Trucs & Astuces
  Scripts
  Regex
  Annuaire
  Articles

.
      
 Articles   Un moteur de recherche en PHP  Par Grégory KOKANOSKY   Octobre 2000    »  Introduction
 »  La théorie
 »  Un peu de complexité
 »  L'affichage des résultats


Introduction

PHP est le langage rêvé pour développer un petit moteur de recherche sur un site web. En effet, le fonctionnement d'un moteur de recherche est très simple : il cherche la chaîne fournie par l'utilisateur dans une base de données 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 ses 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 requête SQL suivante :

SELECT * FROM matable WHERE champs='cequejecherche'
Prenons un exemple. La table albums a la structure suivante :

id artiste titre
1 RATM The Battle of LA
2 Silverchair Neon Balroom
3 SilverHawk Aigle D'argent

Avec la requête suivante :
SELECT titre FROM albums WHERE champs='Silverchair'
Nous récupérons le champ titre pour lesquel artiste='Silverchair'. Nous obtenons donc 'Neon Balroom'.

C'est la forme la plus simple du moteur de recherche, en effet il ne retournera que les occurrences exactes. Pour créer un moteur de recherche plus évolué, il suffit d'utiliser une requête SQL plus recherchée :
SELECT * from albums where artiste LIKE '%cequejecherche%'
Cette requête retourne les enregistrements dont le champ artiste contient la chaîne 'cequejecherche'.
En SQL, % est un caractère "joker". Il représente n'importe quelle chaîne de caractères.

Si on exécute la requête suivante sur notre table :
SELECT titre from albums where artiste LIKE %Silver%
On obtient 2 titres : Neon Balroom et Aigle D'argent.

Nous voilà avec un joli moteur de recherche. Mais celui-ci possède également un très gros défaut : il n'effectue sa recherche que sur une chaîne. Il serait intéressant de pouvoir faire une recherche sur plusieurs chaînes.

Un peu de complexité

Ce que je propose, c'est d'éclater la chaîne en autant de chaînes que de mots la composant.
La chaîne recherchée est stockée dans la variable $recherche, $operateur correspond à 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.

<?php

// on passe les mots recherchés en minuscules
$recherche = strtolower($recherche);

// on remplace les ' + , :  par des espaces
$mots = str_replace('+', ' ', trim($recherche));
$mots = str_replace('\'', ' ', $mots);
$mots = str_replace(',', ' ', $mots);
$mots = str_replace(':', ' ', $mots);

// on place les differents mots dans un tableau
$tab = explode(' ' , $mots);

// on compte le nbr d'élément du tableau.
$nb = count($tab);

//on prépare la requête SQL.
$sql = "select * from search where 1 and mot_cles like \'%$tab[0]%\' ";

// on boucle pour integrer tous les mots dans la requête
for($i = 1; $i < $nb; $i++) {
  
$sql .= "$operateur mot_cles like \'%$tab[$i]%\' ";
}

// on se connecte au serveur
mysql_connect($host, $user, $passwd);

// on execute la requête SQL.
$result = mysql_db_query($db, $sql);

if (
$result) {
  
  if (
mysql_num_rows($result) == 0) {

    
// Si il n'y a pas de résultats
    
echo "<center><b>Pas de Résultat</b></center><br>";

  } 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><br>";
    }

    
mysql_free_result($result);
  }

}

echo
"La requête SQL executée est : $sql";

?>

Nous avons réussi à coder un petit moteur de recherche fonctionnel vous permettant d'indexer des liens ou des resources sur votre siteweb personnel.

L'affichage des résultats

Le problème avec le code précédent c'est que si nous avons 100 réponses à notre requête, les 100 réponses vont être 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 affiche les résultats comme les grands que sont Voila ou AltaVista, c'est à dire 10 réponses par page et des liens permettant de passer d'une page à une autre.

Pour réaliser l'interface de navigation, il faut d'abord choisir combien de réponses nous voulons par page. Nous choisirons ici 10. Ce paramètre sera à ajouter dans notre fichier de configuration.
$limit = 10;
Pour obtenir seulement un nombre restreint de résultats par page, il va falloir modifier notre requête SQL de la facon suivante :
SELECT FROM search WHERE mot_cles LIKE '%larecherche%' LIMIT $debut,$limit;
Cette requête sélectionne les lignes de la table où mots_cles comporte un occurrence de $larecherche et ne renvoie qu'un $limit nombre de lignes en partant de $debut.

En plus clair si nous avons des résultats et que $debut=10 et $limit=5, MySQL nous renvoie les resultats 10, 11, 12, 13, et 14. Pour pouvoir réaliser cette fonction, il nous faut donc savoir combien il y a de résultats à notre recherche.
Ce nombre correspond en fait au nombre de lignes du tableau résultat renvoyé par MySQL.
$nrows = mysql_num_rows($result);
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 à partir duquel on commence l'affichage.
On passera tous ces paramêtres dans l'url.

On obtient donc le code suivant :

<?php

if ($debut > 0) {
  echo
"<a href=search.php3";
  echo
"?recherche=$recherche";
  echo
"&operateur=$operateur";
  echo
"&debut=".($debut - $limit)."><<</a>";
}

if (
$nombre > 1) {

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

}

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

?>

Vous avez donc maintenant un moteur de recherche tout neuf :-) . Maintenant c'est à vous de jouer pour l'adapter à vos besoins.

Vous pouvez voir un exemple [ ici ] | le source est [ ici ]

Synseo