Effectuer une recherche par mots clés

cs_imanossa Messages postés 4 Date d'inscription samedi 19 mai 2007 Statut Membre Dernière intervention 2 juillet 2008 - 31 mai 2008 à 17:23
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 4 juin 2008 à 16:34
Bonjour,
voilà, je développe ma première application "Gestion electronique des docuents".
j'utilise delphi 7 et sql sous oracle 9i
Mon problème est la recherche par mots clés, pour celà :
- j'ai une table DOCUMENT qui contient le champ "mot_cle"
- une table MOT_CLE elle contient tous les mots clés de tous les documents
Pour chaque nouveau document : j'ai un edit qui portera tous les mots clés de ce nouveau doc, l'utilisateur ne saisi rien il selectionne ces mots clés sur une autre fenêtre(ajouter mots clés) puis il valide.
A la recherche d'un document, l'utilisateur tappe la liste des mots ensuite il lance la recherche des documents,
ma question est de trouver la bonne requete qui réalise cette recherche , car j' ai trouvé pas mal de requetes mais aucune d'entre elles ne répond. Si ce que je viens de dire n'est pas clair, vous pouvez me demander plus de précisions...
imanossa

8 réponses

HAFTARIFOUAD Messages postés 256 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 6 janvier 2011
31 mai 2008 à 21:26
Bonjour


Désolé pour mon message qui s'affiche pas.

Je pense que la requête laquelle je vais vous donner, vous sera utile:

with Query do
 begin
 
Active:=false; SQL.Clear;
 SQL.Add( 'Select * From Assurance.db');
 SQL.Add ('WHERE (Upper(NomChamp) LIKE "%'+ AnsiUpperCase(Edit1.Text)+'%")');
 SQL.Add (con+'(Upper(IMMATRICULATION) LIKE "%'+ AnsiUpperCase(Edit2.Text)+'%")');

 Active:=true;
 end;

Con = condition sa peut être 'AND' ou 'OR'

Bonne chance et plein de succès.
0
cs_imanossa Messages postés 4 Date d'inscription samedi 19 mai 2007 Statut Membre Dernière intervention 2 juillet 2008
1 juin 2008 à 12:51
C'est moi encore une fois
0
cs_imanossa Messages postés 4 Date d'inscription samedi 19 mai 2007 Statut Membre Dernière intervention 2 juillet 2008
2 juin 2008 à 10:24
C'est moi encore une fois
0
cs_imanossa Messages postés 4 Date d'inscription samedi 19 mai 2007 Statut Membre Dernière intervention 2 juillet 2008
2 juin 2008 à 10:25
Bonjour tout le monde,

j'ai trouvé la solution !!
la requete est la suivante:
FROMWHERE mot_cle LIKE ' %' || :parametre || ' %'

mais elle m'a causé un autre problème:
le résultat s'affiche sur un DBGrid et il suffit qu'un mot ne soit pas trouvé pour que le DBGrid n'affiche rien !!! autrement dit, si tous les mots (tappés) sont trouvés alors le DBGrid affiche tous les documents qui contiennent au moins l'un de ces mots, sinon si un mot n'est pas trouvé (érroné par exemple) le DBGrid n'affiche rien !! 

merci de me répondre
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
2 juin 2008 à 13:06
D'où ma remarque précédente sur la méthode proposée..
et il est normal qu'avec ta solution que dès qu'un mot clé n'est pas bon, rien n'est retourné puisque la chaîne comparée est différente.

En fait le problème est un peu plus comliqué que çà :

Il faut en fait aboutir à ce que la recherche permette l'affichage avec un maximum de mots clés pric en compte.


il faut tester chaque mot clé les uns après les autres et pour ceux positifs ajoutés les autres un par un etc.. jusqu'à trouver la solution optimum.

cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
2 juin 2008 à 14:14
J'ai perso déjà eu ce problème à traiter..
et j'ai choisi de constituer une liste de mots clés préalable dans lequel l'utilisateur pioche.


Mais à l'usage, c'est pas simple car cela oblige l'utilisateur à réfléchir à TOUS les mots clés qui peuvent être placés sur un même document
(ce qui n'est pas du tout évident pour tout le monde)
ex :
doc A mots clés (x, y)
doc B mots clés (x, y, t)
doc C mots clés (x, y, t)
 
si tu cherches t tu n'auras pas A etc etc..

Et au final, j'ai abandonné cette solution pour mettre en place une recherche de chaîne dans chaîne (LIKE) dans l'objet du document (texte libre)
cette technique est prévue par défaut dans le TcxGrid.

Ce qui permet d'effectuer rapidement plusieurs extractions en modifiant la requête grace à un assistant (avec des and et des or et des éludation de lettres etc..)

cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
2 juin 2008 à 18:00
1- Pas du tout, l'utilisateur n'a pas besoins de connaître tous les mots clés d'un même document !! mais d'après ce qu'il cherche, il peut donner n'importe quel mot

oui, mais si le mot n'est pas tapé correctement résultat->>> rien


2- Si je cherche t ce n'est plus la peine d'afficher doc A, c'est évident, n'est ce pas ?


oui, dans ton cas, puisque que tu n'utilises pas de liste de mots clés type



Après avoir lancer la recherche (en appuyant sur le bouton "Résulat") il affiche A, B,C pour le mot "y"
ensuite, il avance dans la recherche avec le bouton "suivant" il affiche BC pour le mot "t"
MAIS QUAND IL ARRIVE  AU MOT CLE  "Z", ce mot n'existe pas alors le dbgrid n'affiche rien !!



oui mais tu réagis comme si tu connaissais le résultat à l'avance..
dans la réalité, ce n'est pas aussi simple que çà..fais l'expérience..

l'utilisateur ne saura jamais s'il faut cliquer ou recliquer sur suivant..
il faut repartir de l'axiome de départ :
L'utilisateur cherche le maximum de documents qui comporte un ou plusieurs mots choisis.
Autrement dit il faut mieux simplifier l'algorithme et poser comme règle :

on prend par défaut la sélection des mots clés qui renvoie le maximum de dossier
sinon j'ai peur que l'on s'y perde..

Il faut donc faire une boucle et tester tous les cas..
Ta requête doit donc être dynamique et s'adapter à tous ces cas
et à chaque fois il faudra tester le nombre de documents renvoyés (recordcount)
et ne retenir que le plus grand d'entre eux (max)
Il faudra donc tout stocker en permanence de façon à récupérer les élèments du cas retenu et pouvoir afficher les documents.

et si tu tombes sur un cas vide..
ah ?
Tu souhaites qu'il renvoie qlqchose.. ce n'est pas logique..
si un mot est faux il ne faut rien renvoyer
sinon comment faire la différence ?

A l'utilisateur de modifier sa saisie.

et attention aussi car tu n'as prévu que des additions de liste..
et si les docs ont uniquement le premier et le cinquième mot clé ?

cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 juin 2008 à 16:34
pour le moment ça marche

C'est le principal [auteur/IMANOSSA/1065551.aspx imanossa].
et demain est un autre jour
bon courage

cantador
0
Rejoignez-nous