Requete de recherche sur plusieurs mots ?

Requete de recherche sur plusieurs mots ? - SQL/NoSQL - Programmation

Marsh Posté le 08-03-2005 à 12:09:06    

Bonjour,
 
j'ai une fonction de recherche qui est la suivante :
 
Code:
 

Code :
  1. SELECT distinct id_oeuvre,titre,support,genre,date_parution
  2. FROM genre g,oeuvre o,auteur a,edition e,support s
  3. WHERE s.id_support=o.id_support
  4. and g.id_genre=o.id_genre
  5. and e.id_editeur=o.id_editeur
  6. and a.id_auteur=o.id_auteur
  7. and (
  8. o.titre LIKE ('motcle')
  9. OR g.genre LIKE ('motcle')
  10. OR o.date_parution LIKE ('motcle')
  11. OR o.descriptif LIKE ('motcle')
  12. OR e.editeur LIKE ('motcle')
  13. OR a.nom_aut LIKE ('motcle')
  14. OR a.prenom_aut LIKE ('motcle')
  15. )
  16. ORDER BY o.id_oeuvre;


 
 
je veux faire une requete sur 2 mots clés mais ces mots ne sont pas forcément tout les deux dans le même champ et la même table.
 
Je rentre mes mots clé par un formulaire avec un seul champ et une validation pour lancer la recherche (application JSP).
 
Je voulais savoir si il était possible de faire une recherche sur chaque mots en SQL? si oui comment?
je pensais utiliser des % ou autre chose mais je ne connait pas bien les expression régulière et je ne sais pas si c'est possible en SQL.
 
OU est ce qu'il faut découper ce que j'envoi et faire 2 requetes de recherche.
 
Merci
 
Dams

Reply

Marsh Posté le 08-03-2005 à 12:09:06   

Reply

Marsh Posté le 08-03-2005 à 12:22:49    

et si tu contaténes toutes tes données et que tu fais une recherche avec %???
Genre:
 concat(o.titre,g.genre, ...) like '%motclé1' or pareil like '%motclé2%'...

Reply

Marsh Posté le 08-03-2005 à 13:03:50    

Dans mon formulaire, j'envoie par exemple "humour fantastique"  et je veux faire une recherche sur les champs de ma bdd qui est sur  
"humour fantastique" ou "humour" ou "fantastique"
et là la recherche ce fait sur "humour fantastique" sans discossier ni l'un ni l'autre.
 

Reply

Marsh Posté le 08-03-2005 à 13:59:50    

Je pense qu'il faut extraire tous les mots clefs de ta recherche er ensuite faire un %MOT%.
Si tu as 'mot1 mot2 mot3', tu extraies donc 'mot1', 'mot2' et 'mot3' et ensuite la requete et à faire avec des OR:
where key='%mot1%' or key='%mot2%' or key='%mot3%'
or key2='%mot1%' or key2='%mot2%' or key2='%mot3%'
or key3='%mot1%' or key3='%mot2%' or key3='%mot3%'
 
Ainsi tu auras une recherche sur tous tes champs avec tous les mots clefs. Car chercher 'humour' ou 'fantastique' te retourne bien evidemment les 'humour fantastique' vu que l'emsemble concatené est inclus dans l'union des sous ensembles!

Reply

Marsh Posté le 08-03-2005 à 16:56:12    

j'ai vu des requetes comprenant MATCH et AGAINST, mais je ne vois pas à quoi ça sert exactement je sais que ça fait une recherche mais je ne sait pas ce qui est retourné.
 
Est ce que je pourrait m'en servir?

Reply

Marsh Posté le 08-03-2005 à 17:38:37    

Je sais pas si ca marchera et si c supporté par tous les SGBD, tu utilises quoi comme base?

Reply

Marsh Posté le 08-03-2005 à 18:10:40    

C'est pas supporté par tous les SGBD. Et selon les SGBD qui le supportent, l'implémentation est différente.
 
J'en connais 3 qui le propose gratuitement :
 
MySQL (intégré) Je ne connais pas le scope des fonctionnalités.
MSSQL Server (fonctionnalité à activer, et catalogues à construire et administrer) Fonctionnalités intéressantes.
Oracle (package à télécharger, installer, configurer, créer les catalogues, les configurer, les administrer) Très fragile (faut repopuler les index toutes les 5 minutes sinon ils se bloquent), par contre, les fonctionnalités sont époustouflantes : rechercher par exemple sur les synonymes du champ lexical dans les autres langues.
 
En bref, je tape "pain", et il va me retrouver les lignes qui contiennent le mot "baker".
 
Oracle et SQL Server supportent tous deux les recherches "naturelles" du genre : "le roi du monde", ça va toujours retourner une seule ligne, celle ou y'a "Arjuna" dedans :D Enfin, ça marche comme google quoi ;)

Reply

Marsh Posté le 08-03-2005 à 20:10:13    

J'utilise MySQL.

Reply

Marsh Posté le 08-03-2005 à 20:25:21    

Un exemple de ce que ça peut donner avec Oracle :
 
http://accessories.euro.gehealthca [...] +alcalines
 
=> J'ai tapé des mots en français, et pourtant, il m'a retrouvé des infos en anglais, et à reconnu que "Alkaline" = "Alcalines". Pourtant, nous n'utilisons même pas les fonctions linguistiques, là c'est juste avec la fonctionnalité "recherche de mots similaires, il authorise une erreur de 20% dans l'orthographe des mots.
 
Passe ensuite en français (drapal à gauche), et tu auras une liste un peu plus longue.
 
On trouve par contre un des effets pervers : le dernier lien  ne parle pas du tout de piles, mais il a du trouver un mot avec une orthographe proche, et à retourné le mot quand même... :D
 
PS: Comme la pub Marie "C'est moi qui l'ai fait" (sauf que moi c'est vrai :D)
 
Même chose avec SQL Server (c'est moi qui l'ai fait aussi, même le parseur de la syntaxe de rechercne, j'en ai chié des bulles :D). Cette page indique les possibilités offertes par SQL Server (bien que je ne les ai pas toutes utilisées) et ses limitations.
http://www.manga-torii.com/default [...] erecherche
 
D'après ce que j'ai pu entendre, MySQL a une gestion très proche de cette de SQL Server, pour un syntaxe plus ou moins similaire. Dans tous les cas "freetext" me semble LA fonction à utiliser. (c'est son équivalent que j'ai utilisé pour le premier lien, et ça semble être pas trop mal ;))

Reply

Marsh Posté le 08-03-2005 à 20:36:23    

Ah, et j'allais oublier : le plus important dans tout ça, c'est le différence de rapidité avec un LIKE.
 
Si l'indexation est lente et gourmande (Microsoft et Oracle préconisent des quadri-processeur avec disques sur double-canaux RAID 50 et quelques 4 Go de RAM par CPU - je te rassures, c'est quelque peut éxagéré pour une utilisation classique, ça tourne très bien sur un serveur modeste ;)), en revanche, la lecture des index est d'une rapidité impressionnante.
 
En pratique, alors qu'un LIKE provoquait un timeout sur le site de GE, alors que la recherche ne portait que sur les différents codes, le nom et la description courte (80 caractères max), maintenant, les requêtes portent sur ce mêmes champs, plus 5 champs de 8000 caractères, ainsi que les noms et intitulés de toutes les images et documents liés aux produits... Tu peux voir que les perfs sont plutôt bonnes, puisque même lorsqu'il n'y a qu'un seul résultat (donc que l'ensemble de 500 000 produits a été parcouru) ça ne dure que 0.5 secondes. (bon, derrière y'a un serveur HP à 7 processeurs et quelques dizaines de Go de RAM, sans parler du reste... mais bon, le serveur héberge aussi une trentaine de bases toutes aussi énormes les autres que les autres, donc ça n'aide pas ;)). A noter d'ailleurs que rien que pour cette page, il doit y avoir une cinquantaine de requêtes (bah ouais, chaque libellé des liens, et autres est cherché en live dans la base par exemple)


Message édité par Arjuna le 08-03-2005 à 20:37:42
Reply

Marsh Posté le 08-03-2005 à 20:36:23   

Reply

Marsh Posté le 08-03-2005 à 23:08:35    

Pourrais tu me donner des liens ou je pourrais avoir des exemples de syntaxe sur ce type de requete ou des cours pour que je m'exerce à ce type de recherche.
Principalement SQL.
 
Merci

Reply

Marsh Posté le 08-03-2005 à 23:18:16    

SQL ça veut rien dire, c'est un language, et ce language ne comporte pas de fonction de recherches sur texte indexé ;)
 
Sinon, vu que tu travailles sur MySQL, je pense que simplement la doc en ligne de MySQL pourra t'aider. Le souci, c'est que je ne connais pas du tout MySQL, donc je peux guère t'en dire plus [:spamafote]

Reply

Marsh Posté le 08-03-2005 à 23:21:47    

Je pense qu'à partir de cet article, tu devrais trouver ton bonheur.
 
http://dev.mysql.com/doc/mysql/en/fulltext-search.html

Reply

Marsh Posté le 09-03-2005 à 09:20:13    

ok merci. je vous tien au courant

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed