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

SQL Procédural MySQL Discussion :

Calcul de la pertinence des mots dans un moteur de recherche


Sujet :

SQL Procédural MySQL

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    496
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 496
    Points : 467
    Points
    467
    Par défaut Calcul de la pertinence des mots dans un moteur de recherche
    Bonjour,

    Je cherche a savoir comment faire pour trier les résultats d'une requête selon la pertinence des mots.

    Si par exemple je tape ciel et soleil dans le formulaire de recherche je voudrai que les premiers résultats a s'afficher traite ces deux mots ensemble et que les suivant traite indépendemment les autres mots.

    En clair un résultats contenant :

    1. Ciel et Soleil

    2. Ciel

    3. Soleil
    Un autre exemple avec chat souris chien

    1. Chat Souris Chien

    2. Chat Souris

    3. Souris Chien

    4. Chat Chien

    5. Chat

    6. Chien

    7. Souris
    Mes exemples sont un peu simple mais résument bien ce que je désire faire

    Cordialement

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    WHERE MATCH('ciel soleil') AGAINST( ColonneTexte IN BOOLEAN MODE) > 0
    ORDER BY MATCH('ciel soleil') AGAINST( ColonneTexte IN BOOLEAN MODE)
    Le résultat de MATCH sera le nb de mots trouvés.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    496
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 496
    Points : 467
    Points
    467
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    WHERE MATCH('ciel soleil') AGAINST( ColonneTexte IN BOOLEAN MODE) > 0
    ORDER BY MATCH('ciel soleil') AGAINST( ColonneTexte IN BOOLEAN MODE)
    Le résultat de MATCH sera le nb de mots trouvés.
    Voici la partie de code que je pense devoir modifier mais comment ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           $sql = "SELECT SQL_CALC_FOUND_ROWS $Champs FROM $Table WHERE " . (!strcasecmp($EtOu, 'AND') ? '1=1' : '1<>1');
            foreach ($tab as $v) {
                $sql .= " $EtOu $Cles LIKE '%%" . mysql_real_escape_string($v) . "%%' ";
            }
            $sql .= "ORDER BY $Ordre ASC LIMIT %d,%d";
    Sachant que les mots sont collecter par

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    496
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 496
    Points : 467
    Points
    467
    Par défaut
    Bon voila j'ai essayer plusieurs choses mais ça ne marche pas.

    Comment on fait avec la partie du code plus haut pour y insérer la fonction MATCH

  5. #5
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 086
    Points
    6 086
    Par défaut
    il y a des fonctionnalité de mysql qui permette de faire recherche avec le niveau de pertinence. Full-text
    http://dev.mysql.com/doc/refman/5.0/...xt-search.html
    ça peut t'aider je pense.

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    496
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 496
    Points : 467
    Points
    467
    Par défaut
    il y a des fonctionnalité de mysql qui permette de faire recherche avec le niveau de pertinence. Full-text
    http://dev.mysql.com/doc/refman/5.0/...xt-search.html
    ça peut t'aider je pense.
    Je suis allé voir sur le site indiquer plus haut et désoler mais je n'y arrive toujours pas.

    Je ne sais pas comment intégré la recherche en fulltext dans ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $sql = "SELECT SQL_CALC_FOUND_ROWS $Champs FROM $Table WHERE " . (!strcasecmp($EtOu, 'AND') ? '1=1' : '1<>1');
            foreach ($tab as $v) {
                $sql .= " $EtOu $Cles LIKE '%%" . mysql_real_escape_string($v) . "%%' ";
            }
            $sql .= "ORDER BY $Ordre ASC LIMIT %d,%d";
            $_SESSION['sql'] = $sql;
            $_SESSION['nb'] = $nb;
            $_SESSION['Q'] = $Q;

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Bonjour, je sais que le sujet date, mais je suis tombé sur le post car je cherche la même chose !

    Et ce qui me perturbe c'est que dans la Doc MySQL (ici donc http://dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html), il est noté ceci :

    La fonction MATCH() effectue la recherche d'une chaîne de caractères dans une liste de textes (et dans un groupe d'une ou plusieurs colonnes utilisées pour l'index FULLTEXT). La chaîne recherchée est donnée en argument à AGAINST(). La recherche est sans distinguer les majuscules des minuscules. Pour chaque ligne de la table, MATCH() retourne une valeur de pertinence, qui est une mesure de la ressemblance entre le chaîne recherchée et le texte de la ligne dans le colonne donnée dans la liste de MATCH().
    Et j'ai essayé le code proposé par 'Antoun' et cela créé des erreurs !
    Citation Envoyé par Antoun Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    WHERE MATCH('ciel soleil') AGAINST( ColonneTexte IN BOOLEAN MODE) > 0
    ORDER BY MATCH('ciel soleil') AGAINST( ColonneTexte IN BOOLEAN MODE)
    Le résultat de MATCH sera le nb de mots trouvés.
    En fait la Doc définie l'inverse au niveau du MATCH et AGAINST, mais j'ai essayé aussi le code inversé sans résultat ...

    Si quelqu'un à une solution je suis preneur.

    Merci d'avance

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    En fait, parfois il suffit d'être courageux et de lire correctement la documentation (au cas où http://dev.mysql.com/doc/refman/5.0/...xt-search.html)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    ColonneTexte  ,
    MATCH (ColonneTexte )
    AGAINST ('ciel soleil') AS score
     
    FROM NomTable
    WHERE
     
    MATCH (ColonneTexte )
    AGAINST ('ciel soleil')
     
    ORDER BY `score` DESC
    Sinon après on peut jouer avec le mode Booléen :
    http://dev.mysql.com/doc/refman/5.0/...t-boolean.html

    Et par exemple on pourrait dire que l'on recherche les lignes qui contiennent le mot ''ciel'', mais classe plus haut les lignes qui contiennent aussi ''soleil'', comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    ColonneTexte  ,
    MATCH (ColonneTexte )
    AGAINST ('ciel soleil') AS score
     
    FROM NomTable
    WHERE
     
    MATCH (ColonneTexte )
    AGAINST ('+ciel soleil' IN BOOLEAN MODE)
     
    ORDER BY `score` DESC
    Et on peut imaginer plein de chose dans le genre, je vais tester les liaisons dans les tables pour voir ce que cela donne

    Merci en tout cas cela m'a permis d'avancer et j'espère que cela servira

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/05/2007, 00h25
  2. Réponses: 2
    Dernier message: 12/12/2006, 17h33
  3. [Word] Comment mettre en évidence des mots dans un document ?
    Par ecocentric dans le forum Framework .NET
    Réponses: 1
    Dernier message: 03/08/2006, 17h31
  4. Chercher des mots dans une ligne
    Par chemouz dans le forum C++
    Réponses: 1
    Dernier message: 17/12/2005, 13h42
  5. Comment changer des mots dans un fichier?
    Par ptitbonum dans le forum Linux
    Réponses: 5
    Dernier message: 08/04/2004, 00h42

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