Création d'un outil de recherche
en VB/SQL


Objectif...

L'objectif de ce TP est :

  • construire un outil de recherche comme on peut en voir couramment : dans les principaux moteurs de recherche, dans les magasins en ligne, dans certains logiciels (exemple : l'aide en ligne de Windows).
  • d'utiliser pour cela des requêtes SQL "concrètes" (telles qu'elles sont largement utilisées sur Internet et dans certains logiciels),
  • pour atteindre cet objectif, on va construire petit à petit des requêtes SQL de plus en plus sophistiquées, tellement sophistiquées qu'on va devoir les construire sous Visual Basic, grâce à ses fonctions de manipulation de chaînes de caractères.

Ce TP est transposable dans d'autres environnements de programmation, par exemple PHP + MySQL.

Durée : 4 heures.


Prérequis...

Les pré-requis nécessaire pour réaliser ce TP sont :

  • MS Access : savoir ce qu'est une base de données, une table, un champs. Savoir construire un formulaire et y associer du code en Visual Basic.
  • Visual Basic : savoir gérer les chaînes de caractères.
  • SQL : savoir écrire des requêtes simples (jointure + condition).
  • Note du 15 avril 09 : si certains veulent faire ce TP en MySQL + PHP, pas de problème, je les aiderai à transposer.

1
Préparation du projet.

Charger une base de données existante sous Access, qui contient (de préférence) beaucoup d'enregistrements, et qui ne soit pas monotable (pour pouvoir faire des jointures). A défaut, utilisez la table des disques (format Access 97, à convertir). En effet, au plus la table est complète, au plus l'outil de recherche se justifie. Par exemple, chez les disquaires sur Internet, on peut chercher un disque parmis des millions de références ! Comment faire sans un outil de recherche performant ?

Travail à faire :

2
Première recherche.

Ce type de recherche a déjà été fait lorsqu'on a fait l'atelier Access, c'est le plus simple. On vérifie si la chaîne saisie par l'utilisateur (dans l'exemple ci-contre : "go") existe :

Travail à faire : réalisez cette requête en vous aidant des indications suivantes :

3
Deuxième recherche :
traiter plusieurs mots-clé.

Cette recherche, et les suivantes, viennent compléter la recherche précédente. Vous devrez donc, à chaque nouvelle recherche proposée, modifier votre procédure existante et non pas en créer une nouvelle.

On va maintenant apporter une première amélioration : si l'utilisateur entre plusieurs mots-clé séparés par des espaces, on ne va plus les considérer comme une seule chaîne de caractères contigüe, mais comme plusieurs mots à rechercher séparément. Dans l'exemple ci-contre, on ne recherche pas les disques qui contiennent la chaîne "gold hit", mais les disques qui contiennent la chaîne gold d'une part, et la chaîne hit d'autre part.

Par exemple, si la chaîne saisie par l'utilisateur est "gold hit", alors la requête que nous allons exécuter est (en gras, ce qui change par rapport à la requête précédente) :

L'objectif est de réaliser un algorithme qui construit cette requête, et ce quel que soit la chaîne saisie par l'utilisateur ! L'algorithme pour réaliser cette requête est le suivant :

SQL = "select numCD, TitreCD & ' (' & NomA & ')' from disque, participer, artiste where not invité and NumCD = Part_NumCD and Part_NumA = NumA "
Tant qu'il y a des espaces dans la chaîne recherchée (grâce à la fonction instr)
  Isoler le premier mot-clé (grâce à la fonction left$)
  SQL = SQL & " and TitreCD & NomA like '*" & le_mot & "*' "
  Supprimer le premier mot de la chaîne des mots-clé (grâce à la fonction right$)
Fin Tant Que
SQL = SQL & " and TitreCD & NomA like '*" & le_dernier_mot & "*' ; "

Affectez ensuite cette requête à la source de données de la zone de liste, comme on l'a fait dans la première recherche*.

4
Troisème recherche :
différencier le 'et' et le 'ou'.

Lorsqu'un utilisateur entre plusieurs mots-clé pour un recherche, il y a plusieurs façons de les traiter :

Travail à faire pour mettre en place la deuxième méthode :

  • Dans votre formulaire Access, ajoutez deux boutons d'option qui permettent à l'utilisateur de choisir si on va appliquer l'opérateur et (en anglais : and) ou l'opérateur ou (en anglais : or) dans la requête.
  • Remarque importante : pour que les boutons d'option soient exclusifs, il faut les mettre dans un cadre (en anglais : frame).
  • Pour que l'utilisateur comprenne, vous n'afficherez pas "et / ou" mais "Tous les mots / Au moins un mot".
  • Modifier la recherche précédente (intitulée "deuxième recherche"), pour remplacer les and par des or le cas échéant. Attention, vous ne devez pas les remplacer dans la jointure : au final, la condition dans la requête devra ressembler à where jointure and jointure ... and (condition and/or condition ...). Seules les conditions portant sur les mots-clés sont séparées par des or le cas échéant.
  • N'oubliez pas les parenthèses pour que SQL gère bien les priorités entre les et et les ou.

 

5
Quatrième recherche :
utilisation des guillemets pour les mots-clé contigües.

Lors de la deuxième recherche, on a fait en sorte que les mots-clé saisis par l'utilisateur ne soient pas recherchés de façon contigüe (gold et hit). Mais parfois, l'utilisateur voudra vraiment rechercher des mots contigüs (par exemple s'il recherche "en passant") ! Les moteurs de recherche proposent l'utilisation des guillemets pour forcer la recherche contigüe. Par exemple :

Travail à faire :

6
Cinquième recherche :
recherche limitée à certains champs.

Dans les librairies ou les disquaires sur Internet, mais également dans les logiciels d'échange de fichiers (par exemple Kazaa), on a la possibilité de préciser sur quels champs on effectue la recherche (titre, auteur, etc.) C'est ce que l'on va programmer maintenant.

Travail à faire :

7
Sixième recherche :
principe du scoring.

Le principe du scoring a été évoqué ci-dessus (3ème recherche, 3ème méthode) : il s'agit de trier les réponses en fonction de leur degré de pertinence par rapport à la liste de mots-clés saisie par l'utilisateur. Par exemple, si l'utilisateur donne comme mots-clé "gold great hit" :

Pour réaliser ce scoring :

Remarque : la recherche ne s'effectue que par rapport au titre du disque. Si on avait voulu la faire également sur le nom de l'artiste, cela devient très complexe, au point qu'on ne peut plus le faire avec une simple requête SQL, mais avec un RecordSet. Il faut en effet, pour chaque ligne, faire un traitement complexe qui est impossible à faire en SQL.

8
Liens.

Comme vous pourrez le voir sur les liens suivants, ce qu'on a fait ici est le minimum de la base du commencement de la recherche simplifiée. Les outils de recherche que vous pourrez voir sur les liens suivants surpassent largement le nôtre !

amazon.fr La page de recherche avancée des livres sur la librairie en ligne amazon.fr.
alapage.fr La page de recherche avancée des disques sur la librairie de France Télécom, alapage.fr.
fnac.fr La page de recherche avancée des vidéos sur le site de la FNAC.
altavista.fr La page de recherche avancée du moteur de recherche altavista.
google.fr La page de recherche avancée du moteur de recherche google.

Sébastien PASTORE.