Créer un outil de recherche.
Réponse AJAX

Recherche simple

On a déjà fait ce genre de requête SQL en début d'année (SQL EPG). C'est un simple LIKE, sur chaque champ recherché.

Pour mettre en place cette recherche, vous devez :

Lorsque ceci est fini, collez votre formulaire et votre code PHP complet ici :

Votre réponse n°1

Recherche avec mots-clés distincts

Etape initiale

Lorsqu'on tape dans une recherche : voyage gulliver, la recherche précédente ne marchera pas à cause du "de" qui sépare voyage et Gulliver dans le titre. Ceci représente pourtant une recherche intuitive qu'on est en droit de vouloir essayer.

Pour que cette recherche puisse fonctionner, il faut séparer chaque mot-clé pour les traiter séparément dans la requête SQL.

Lorsqu'on valide la recherche, isolez chaque mot-clé grâce à un simple appel à la fonction explode.

Parcourez le tableau des mots-clés ainsi créé grâce à un foreach. En parcourant le tableau, construisez une requête qui ressemble à :
SELECT ... FROM films WHERE ( titre LIKE '%mot-clé1%' AND titre LIKE '%mot-clé2%' AND titre LIKE '%mot-clé3%' ) ;

Cette recherche renvoie-t-elle les titres qui contiennent tous les mots-clés saisis, ou au moins un des mots-clés saisis ?

Votre réponse n°2

Que faudrait-il faire pour inverser cette méthode de recherche ?

Votre réponse n°3

Collez ici le code correspondant à cette recherche.

Votre réponse n°4

Combinaison des deux recherches "tous les mots" et "au moins un mot" avec tri des résultats

La méthode idéale consiste à chercher tous les résultats, et à afficher en premier ceux qui contiennent tous les mots-clés, puis ceux à qui il manque un mot-clé, etc.

Il faut donc créer notre calcul de scoring pour trier les résultats. Pour faire ça de façon très simple, on va utiliser l'astuce suivante :

Adaptez votre code pour qu'il effectue cette recherche. Tapez votre code ici :

Votre réponse n°5

Chronométrage de la recherche

On va chronométrer la recherche pour évaluer les gains apportés par les améliorations suivantes.

Prenez une montre ou un chronomètre. Enclenchez-le dès que vous avez appuyé sur le bouton de soumission du formulaire. Arrêtez-le dès que la page s'est complètement affichée. Notez précisément ce temps ici :

Votre réponse n°6

Non, c'est complètement stupide : ce n'est pas comme ça qu'on fait les mesures de performances en programmation. On utilise les chonomètres systèmes, précis au millième de seconde voire plus (en php : microtime), et on répète plusieurs fois la recherche car le temps d'une seule recherche est trop petit pour être significatif.

On va donc appliquer la technique suivante :

$temps_de_départ = microtime(true); for ($compteur_de_recherche=0; $compteur_de_recherche < 10000; $compteur_de_recherche++) { // Placez ici le code de votre recherche, sans l'affichage des résultats. } echo "Les 10 000 recherches ont pris : ".(microtime(true) - $temps_de_départ)." secondes" ; // Placez ici le code qui affiche les résultats de votre recherche

Mettez ceci en oeuvre puis notez ici le temps pris par vos 10 000 recherches :

Votre réponse n°7

Notez ici les mots-clé utilisés par cette recherche chronométrée, on réutilisera les mêmes plus tard :

Votre réponse n°8

Comparez ce temps à celui de vos voisins pour vérifier que votre recherche n'est pas trop lente, parce mal programmée.

Mettre en évidence les résultats

On va mettre en évidence, dans les résultats, les mots-clé ayant servi à la recherche.

La balise HTML qui sert à mettre en évidence est la balise <strong>. Par défaut, elle a le même rendu que la balise <b>, mais vous pouvez renforcer ce rendu avec un CSS (par exemple mettre une couleur).

Créez la fonction highlight($texte, $motclé) qui remplace dans $texte toutes les occurences de $motclé par <strong>$motclé</strong>. Utilisez pour cela la fonction PHP str_ireplace. Collez ici la fonction.

Votre réponse n°9

Appliquez cette fonction aux résultats de la recherche, au moment de les afficher. Les mots-clés doivent apparaître en évidence.

Recherche instantanée : préparer la table des mots-clés

Explications sur... les recherches instantanées

Notre recherche est lente, puisqu'on compare les mots-clés recherchés aux 90 000 titres présents dans la base de données. Comment fait GOOGLE pour faire chaque seconde des millions de recherches dans des millions de pages Web instantanément ? Outre le fait qu'ils ont des dizaines de milliers de serveurs qui planchent là-dessus, ils ont bien du chercher à optimiser.

La méthode est simple, il suffit de rajouter deux tables qui nous donnent immédiatement accès à un identifiant de film en fonction du mot-clé saisi. Ainsi, et au prix d'un petit sacrifice en mémoire occupée, la recherche sera toujours immédiate quelle que soit le nombre de mots-clé et quel que soit le nombre de films.

Présentation des deux nouvelles tables

La table qui contient les mots-clés est la suivante :

mot-clé_idmot-clé_libellépopularite_basepopularite_recherches
1voyage13750
2gulliver120
......
Remarque :

La table qui associe les mots-clés aux films et artistes est la suivante (version améliorée) :

mot-clé_idtablechampidposition
1filmfilm_titre3452
1filmfilm_description34524
1artisteart_nom151
............
Cela signifie que le mot-clé numéro 1 est présent :

Créer ces tables

Ecrivez le code qui crée ces deux tables à partir de toutes les données existantes. Pour simplifier, commencez uniquement par indexer les titres des films puis collez votre code ici :

Votre réponse n°10

Envoyez ici une capture d'écran des 10 premiers enregistrements de la table des mots-clé.

Votre réponse n°11

Envoyez ici une capture d'écran des 10 premiers enregistrements de la table d'indexation.

Votre réponse n°12

Dans vos propres applications, vous devrez penser à mettre à jour ces tables à chaque ajout, suppression et modification dans les tables indexées (ici : une modification dans les films ou les artistes entraînerai une mise à jour des index correspondants).

Adaptez votre recherche

Adaptez votre recherche pour qu'elle utilise ces nouvelles tables. N'oubliez pas d'incrémenter le champ mot-clé.popularite_recherches à chaque fois qu'un mot-clé est recherché.

Votre réponse n°13

Dans vos propres applications, vous devrez penser à mettre à jour ces tables à chaque ajout, suppression et modification dans les tables indexées (ici : les films et les artistes)

Chronométrage de la recherche

Sortez une montre ou un chronomètre... non, je plaisante. Notez ici le temps pris par 10 000 recherches effectuées sur les mêmes mots-clé que la recherche de l'étape précédente.

Votre réponse n°14

Amélioration de la recherche instantanée

Nettoyer la chaîne

En observant la table des mots-clés, on constate que le même mot-clé apparaît plusieurs fois , par exemple : aventure, aventures, l'aventure, aventure,.

On devine qu'on peut effectuer un premier nettoyage en supprimant les caractères non alphabétiques.

Ecrivez une fonction nettoieChaîne($chaine) qui nettoie la chaîne reçue en paramètre en remplaçant par des espaces les caractères : , ; . ' " ! ? : -. Utilisez pour ça la fonction PHP strtr.
Cette réponse est éligible à la qualité de réponse parfaite si elle tient en deux lignes.

Votre réponse n°15

Apliquez cette fonction :

On peut encore rendre la recherche plus souple en supprimant les accents :

Ecrivez une fonction simplifieMotClé($motclé) qui supprime les accents du mot-clé reçu en paramètre. Utilisez pour ça la fonction PHP strtr.
Cette réponse est éligible à la qualité de réponse parfaite si elle tient en deux lignes.

Votre réponse n°16

Apliquez cette fonction (avant ou après avoir isolé les mots-clé) :

Nettoyer la chaîne et éviter l'indexation des mots-clés non significatifs (pronoms, etc.)

Créez une fonction motIdexable($motclé) qui renvoie faux si le mot est insignifiant, vrai s'il est indexable.

Les mots insignifiants sont le, la, les, l', ce, ces, je, j', un, une, etc. (à vous de compléter la liste en fonction des besoins).

Adaptez la recherche et l'indexation pour qu'ils ignorent ces mots.

Dans le cas où l'utilisateur tape un mot-clé qui n'existe pas : suggestion de mots-clé proches

Dans le cas où la recherche ne renvoie aucun résultat, l'utilisateur a peut-être mal saisi un mot-clé. Google suggère des mots-clé approchants même si la recherche a donné des résultats.

Si la recherche ne donne rien, alors pour chaque mots-clé saisi :

Ensuite, utilisez la fonction de tri des tableaux (sort), et présentez les premiers résultats à l'utilisateur.

Détaillez ici le calcul de scoring que vous avez choisi :

Votre réponse n°17

Collez ici le code qui propose les mots-clés (ne collez pas TOUTE la page)

Votre réponse n°18

Suggestions de recherche en AJAX

Suggestions améliorée : nombre de recherches par mot

Suggestions améliorées : succession des mots