Amélioration de notre moteur de recherche

Amélioration

Dans le chapitre précédent, nous avons fabriqué un moteur de recherche opérationnel, mais qui souffre d'un petit défaut :
Le même mot trouvé dans plusieurs champs augmente le score d'autant.

Cela a tendance à fausser les résultats et nous allons remédier à cela en modifiant notre méthode de calcul du score.

Le code final :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Moteur de recherche</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>Moteur de recherche</h1>    

    <form action="index.php" method="post">
        <input type="text" name="recherche" required>
        <button type="submit">Rechercher</button>
    </form>

    <?php
        if (isset($_POST['recherche']) && strlen($_POST['recherche']) > 0) {

            $words = explode(' ', $_POST['recherche']);
            $fields = ['nom','description'];
            
            $scorePart = '0';
            $wherePart = '0';
            
            $replacements= []; // Step 4

            foreach ($words as $index=>$word) {
                $replacements["word$index"] = "%$word%";
                $scorePart .= '+(0';
                foreach ($fields as $field) {
                    $scorePart .= " or ($field like :word$index)";
                    $wherePart .= " or $field like :word$index";
                }
                $scorePart .= ')';
            }

            $sql = "select *, sum($scorePart) as score from produits where $wherePart group by id order by score desc";            
        
            $db = new PDO('mysql:host=localhost;dbname=recherche', 'root', 'root');
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $requete = $db->prepare($sql);
            $requete->execute($replacements);            
            $produits = $requete->fetchAll(PDO::FETCH_ASSOC);
            

            if (count($produits) == 0) {
                echo '<p>Aucun résultat</p>';
            } else {
                echo "<ul>";
                foreach ($produits as $produit) { ?>
                    <li>
                        <div><?php echo $produit['nom'] . ' ' . $produit['prix']; ?>€</div>
                        <div><?php echo $produit['description']; ?></div>
                    </li>
                <?php }
                echo "</ul>";
            }
        }
    ?>
</body>
</html>

Le mot de la fin

Et voilà ! Nous savons maintenant réaliser un petit moteur de recherche.
N'hésitez pas à laisser vos questions et commentaires dans la partie dédiée en bas de page.

J'espère que ce tuto vous a apporté des connaissances intéressantes !

À bientôt !

CHAPITRE PRECEDENT

Commentaires

Pour déposer un commentaire

  • kefalas (le 10/01/2023 à 11:07)

    Bonjour, monsieur,
    Très bon tuto sur le moteur de recherche qui fonctionne et facile à comprendre pour un débutant!
    J'aurais juste une question, je souhaiterais faire un recherche sur un mot quelconque dans ma base, par exemple Règle plate, ou n'importe quel mot (qui ne soit pas bleu ou rouge) qui ne soit pas préprogrammé... mais je ne vois pas comment faire...
    Pourriez-vous m'indiquer la marche à suivre.
    D'avance merci pour votre tuto, et votre réponse
    Cordialement
    Gilles