IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Match Against


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 3
    Points : 1
    Points
    1
    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.

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    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

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    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.

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    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...

    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

Discussions similaires

  1. Match against et pertinence.
    Par ddelec24 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 26/07/2007, 15h54
  2. Probleme avec "match against"
    Par biggione dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/03/2007, 14h57
  3. Problème recherche match.. against
    Par pierre_pogo dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/08/2006, 10h45
  4. [MySQL] match against et % ou autre jocker
    Par carelha dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 27/04/2006, 18h21
  5. [MySQL] MATCH AGAINST et $-session
    Par carelha dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 25/04/2006, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo