Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2012, 17h53   #1
Invité de passage
 
Inscription : février 2012
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 3
Points : 0
Points : 0
Par défaut Match Against

Bonjour,

J'ai un petit souci avec l'instruction en sujet.

Je ne trouve pas comment faire pour que la requête me retourne les enregistrements du type "abcdef" quand je fais une recherche sur deux mots "abc" "def".

Y-a-t'il une possibilité pour ça?
J'ai essayé diverses façons, en séparant les chaînes, et utilisant des jokers du type * etc, sans succès.

A part concaténer préalablement les chaînes je ne vois pas comment faire, ce qui pose un soucis puisque les mots recherchés sont tapés par un utilisateur et le nombre de combinaisons est exponentiel.
De plus je ne sais pas à priori quels mots doivent être concaténés donc la recherche risque de me retourner des résultats non pertinents, alors qu'avec la valeur de retour de Match je pourrais trier lesdits retours.
Dot Tom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 10h02   #2
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 875
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 875
Points : 1 368
Points : 1 368
salut,

y a pas de solution pour faire ça en fulltext... ce que tu demandes c'est le boulot d'une regexp...

comme son nom l'indique, tu indexes des mots par rapport à leur début... après aucune base de donnée mysql ne sera optimisée pour faire ce que tu demandes à grande échelle... faudrait passer par une application en c/c++ genre sphynx

oublie une regexp en mysql car son temps d'exécution est juste vite prohibitif

éventuellement passer par les fonctions de recherche de sous-chaine...

après sans rien de concret dur d'en dire plus...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 10h17   #3
Invité de passage
 
Inscription : février 2012
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 3
Points : 0
Points : 0
Merci pour ta réponse.

En fait, c'est pour un moteur de recherche sur un site web.

L'utilisateur va taper X mots dans le champ de recherche, et je vais chercher dans différents champs d'une BD ce qui correspond le mieux à sa demande.

Prenons par exemple, un site marchand qui vend des vidéoprojecteurs.
Un client cherche un "Optoma HD 33".
Admettons que dans la base de données, la marque soit bien "Optoma" et que le nom du produit soit "HD33".

Si je fais un "MATCH (marque, désignation) AGAINST ('Optoma HD 33')" sur la BDD, la requête ne va pas me retourner le produit en question, et là est mon problème.

En fait, je voudrais que le MATCH tel que je pensais l'écrire, me retourne tous les enregistrements pour lesquels il y aurait dans la marque ou la désignation au moins un des mots tapés, que cela soit ou non une sous chaîne, avec un indice de correspondance, comme le fait MATCH habituellement.
Par exemple, le produit HD33 de marque Optoma dans la BDD serait retourné avec un indice élevé, et le produit HD300 de marque Optoma avec un indice plus faible... et les produits Optoma sans "HD" ni "33" avec un indice encore plus faible.

Aujourd'hui pour obtenir ce que je veux je suis obligé de passé par des LIKE et de calculer un indice de pertinence moi-même, je souhaiterais m'en passer et j'espérais pouvoir faire cela avec un simple MATCH sur plusieurs champs.

Maintenant tu as peut-être une solution plus intéressante que je n'ai pas imaginée
Dot Tom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 10h21   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
J'ai du mal à comprendre la raison de ce besoin !

Si je cherche sur Google "PHP MySQL", je ne m'attends pas à ce qu'il concatène les deux mots pour qu'il me renvoie un hypothétique résultat "PHPMySQL" !
Par contre, il me semble que la recherche FULL TEXT devrait sans problème me retourner un score assez élevé avec la chaîne "PHP/MySQL".
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 10h33   #5
Invité de passage
 
Inscription : février 2012
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 3
Points : 0
Points : 0
La raison de ce besoin je viens de la donner

Dans une désignation produit, en particulier technologique, tu ne sais jamais s'il y a un espace, un tiret, ou aucun séparateur.

J'ai pris un exemple avec le HD33 mais j'aurais pu en prendre beaucoup d'autres.
La façon la plus sûre de trouver ce que tu cherches, c'est de séparer les éléments, parce que tu te dis que si c'est concaténé le site va quand même te retourner le bon résultat.

Or avec MATCH, si c'est concaténé il ne me retourne rien justement.
Dot Tom est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 10h46   #6
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 875
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 875
Points : 1 368
Points : 1 368
oui, en effet...

tu peux faire des recherches plus customisée en utilisant l'option "in mode boolean" et en indiquant la pertinence de chaque mot via des caratère de contrôle autour des expressions...

mais là encore ne rêve pas ça ne te fera jamais ce que fait une regexp, ça ne peut te trouver que des expressions commençant par chaque expression donnée, pas avec elles au milieu ou en fin...

si tu veux ce que fait google ou tout service de référencement utilise le mais le problème c'est que tu n'auras jamais de contrôle réel sur ce que tu recherches...

autrement soit tu développes en c/c++ ou java un utilitaire qui indexe les mots et les soumets à une regexp ou d'une formule de distance entre 2 expression... et la c'est pas le plus simple qui t'attend...

soit tu as des solutions tiers partie à mysql...

la recherche comme avec des regexp en fulltext n'existe pas de base en mysql...

soit tu peux essayer de voir avec des sgbd autre (postgre, sql server ou oracle) mais c'est une problématique qui n'est jamais traitée comme ça dans aucun d'eux, je pense... enfin de ce que je me souvient de mes cours de fac en oracle... à confirmer et voir en fonction des couts éventuels de licence...

__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 11h54   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Citation:
La raison de ce besoin je viens de la donner
Il y a 4 minutes entre ton message et le mien. J'ai répondu au premier message pendant que tu rédigeais la réponse.

Bref...

Je ne suis pas habitué à la recherche FULL TEXT mais il me semble que si je cherche "HD" et que la colonne contient "HD33", la ligne devrait être retournée avec un assez bon score nom ?
De même si je cherche "33" ?

Alors si tu peux exploser les mots de la recherche et additionner les résultats des MATCH AGAINST sur chaque mot de la recherche, tu devrais avoir une pertinence assez bonne en résultat sur une recherche "HD 33" pour obtenir "HD33".

Grosso modo :
Code :
1
2
3
4
5
SELECT /*match sur le premier mot*/ + /*match sur le deuxième mot*/ + /*...*/ AS pertinence
FROM la_table
WHERE /*match sur le premier mot*/
  AND /*match sur le deuxième mot*/
  AND /*...*/
À voir si l'addition est l'opération la meilleure pour avoir une pertinence fiable et si AND ou OR dans le WHERE. Encore une fois, je ne suis pas du tout habitué à cette pratique de recherche FULL TEXT.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h53.


 
 
 
 
Partenaires

Hébergement Web