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

PHP & Base de données Discussion :

Recherche avec Match Against [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut Recherche avec Match Against
    Après plusieurs heures de recherche, je laisse un message sur ce forum.

    J'essaye de faire une recherche dans une table avec la fonction Match ... Against.

    Voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $res_recherche = mysql_query("SELECT * FROM `annonces` WHERE MATCH (`titre`,`message)` AGAINST ('$mots')");
    Et voici mon code d'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ( $affiche_resultat = mysql_fetch_row($res_recherche) )
    {
    echo $affiche_resultat[0].' titre : '.$affiche_resultat[1].' | message : '.$affiche_resultat[2].'<br>';
    }
    Le problème, c'est que je n'obtiens aucune réponse.


    Avec le "IN BOOLEAN MODE", j'obtiens des réponses, mais elles ne sont pas assez pertinentes, donc je l'ai supprimé et depuis plus rien.

    Je pense que le problème vient d'une histoire d'index fulltext, mais impossible d'en savoir plus.

    Quelqu'un a une idée ? Merci.

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Pour commencer, il faudrait savoir si tu as une erreur ou si ça ne ramène simplement pas de résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $res_recherche = mysql_query("SELECT * FROM `annonces` WHERE MATCH (`titre`,`message)` AGAINST ('$mots')")
      or die(mysql_error());

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Non, pas d'erreur, enfin plus d'erreur on va dire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo "Error : ".mysql_error()."<hr>";		
    echo "Number of results : ".mysql_num_rows($res_recherche)."<hr>";
    Ces 2 lignes renvoient rien et 0.


    Mais avant, j'ai eu pas mal de messages du style :

    The used table type doesn't support FULLTEXT indexes

    ou encore :

    mysql_fetch_row(): supplied argument is not a valid MySQL result resource


    Mais apparemment c'est réglé puisque je ne les ai plus. J'ai modifié ma table en cochant les cases index et fulltext.


    Je n'ai donc pas de résultat et pas d'erreur, alors qu'en mode booléen, j'obtiens de bon résultats mais pas pertinents, et là je ne comprends plus.

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Ta table est bien en MyISAM ? Si tu ne sais pas, SHOW CREATE TABLE.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Je pense que oui puisqu'en faisant un Show Create Table annonces; , j'obtiens ça en fin de message :

    ENGINE=MyISAM

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    OK... tu as bien créé un index FULLTEXT sur la combinaison titre/message ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Plusieurs fois même apparemment grace à Sow Create Table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    CREATE TABLE `annonces` (
      `id` int(3) NOT NULL auto_increment,
      `titre` varchar(50) collate utf8_unicode_ci NOT NULL,
      `message` varchar(500) collate utf8_unicode_ci NOT NULL,
      PRIMARY KEY  (`id`),
      KEY `titre_3` (`titre`),
      KEY `message` (`message`(333)),
      FULLTEXT KEY `titre` (`titre`,`message`),
      FULLTEXT KEY `titre_2` (`titre`),
      FULLTEXT KEY `message_2` (`message`),
      FULLTEXT KEY `titre_4` (`titre`,`message`),
      FULLTEXT KEY `titre_5` (`titre`,`message`),
      FULLTEXT KEY `titre_6` (`titre`,`message`),
      FULLTEXT KEY `titre_7` (`titre`,`message`),
      FULLTEXT KEY `titre_8` (`titre`,`message`),
      FULLTEXT KEY `titre_9` (`titre`,`message`),
      FULLTEXT KEY `titre_10` (`titre`,`message`),
      FULLTEXT KEY `titre_11` (`titre`,`message`),
      FULLTEXT KEY `titre_12` (`titre`,`message`),
      FULLTEXT KEY `titre_13` (`titre`,`message`)
    ) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Y'a pas une technique d'ailleurs pour ne le faire qu'une seule fois, et en combinaison, parce que là ça a été fait les 2 champs séparément, mais aussi en combinaison d'après ce que je vois ? Ca fait pas très propre tout ça.

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    C'est même carrément immonde tu veux dire

    La technique, ce serait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE FULLTEXT INDEX toto_idx ON annonces (titre, message) ;
    Mais dans l'immédiat tu as plutôt besoin de DROP INDEX !

    Si on suppose que ton problème n'est pas dû à la multiplicité des index... quels sont les termes que tu recherches ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Citation Envoyé par Antoun Voir le message
    quels sont les termes que tu recherches ?
    Comment ça ? La recherche peut se faire sur n'importe quel terme, c'est pour ajouter un petit moteur de recherche sur mon site.

    Et par soucis de pertinence, je pensais remplacer l'expression "Like" par un "Match ... Against".

    Ce que je peux faire, c'est récréer ma table en utilisant ta ligne de code et voir ce que ça donne.

  11. #11
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par johann51 Voir le message
    Comment ça ? La recherche peut se faire sur n'importe quel terme, c'est pour ajouter un petit moteur de recherche sur mon visite.
    Alors la question c'est "avec quels termes tu testes ?". Parce que les mots qui sont présents dans 50% de l'échantillon sont considérés comme trop fréquents et non pertinents (sauf en BOOLEAN MODE).
    Au passage d'ailleurs, il faut que tu aies au moins 3 lignes sur ta table, sinon tous les mots sont présents dans au moins 50% de l'échantillon.
    Citation Envoyé par johann51 Voir le message
    Et par soucis de pertinence, je pensais remplacer l'expression "Like" par un "Match ... Against".
    Un LIKE ? où ça ?
    Citation Envoyé par johann51 Voir le message
    Ce que je peux faire, c'est récréer ma table en utilisant ta ligne de code et voir ce que ça donne.
    yep

    Au passage, je viens de constater une coquille dans ton premier code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... WHERE MATCH (`titre`,`message)` AGAINST...

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Alors la question c'est "avec quels termes tu testes ?". Parce que les mots qui sont présents dans 50% de l'échantillon sont considérés comme trop fréquents et non pertinents (sauf en BOOLEAN MODE).
    Au passage d'ailleurs, il faut que tu aies au moins 3 lignes sur ta table, sinon tous les mots sont présents dans au moins 50% de l'échantillon.
    Mon problème vient peut-être de là alors. Je vais essayer tout ça en tenant compte de ce que tu dis.

    J'avais plus que 3 lignes ma table, mais y'a un mot clé ("agent") que je testais, donc, j'en ai mis dans le titre pour certaines lignes, dans le message pour d'autres lignes, dans le titre et dans le message pour d'autres, le tout en faisant de vraies phrases quand même, mais peut-être qu'il revenait trop de fois.

    Pour le Like, oublie.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Merci pour la coquille, le problème ne vient pas de là car je n'avais plus cette erreur dans mon fichier.

  14. #14
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    En fait, le BOOLEAN MODE est assez différent... pour ce qui te concerne, il y a notamment les deux différences de fonctionnement :

    • le seuil de 50% n'est pas appliqué
    • la recherche fonctionne même sans index


    Du coup, le fait que ça marche en BOOLEAN et pas en mode normal peut s'expliquer par un défaut d'index comme par le seuil de 50%...

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Merci beaucoup, le problème venait bien de là, mon mot revenant trop de fois en ci peu de lignes, il était donc ignoré. Je vais pouvoir faire mes essais.

    Merci également pour la ligne de code pour indéxer mes 2 champs ensembles.


    Sinon, au niveau de la pertinence, si un mot revient 3 fois dans une ligne et deux dans l'autre, il est normal que la première soit devant.

    Mais si mon mot est présent une fois dans le titre pour une ligne, et une fois dans le message pour l'autre ligne, est-ce qu'il y'a une technique pour que la ligne avec le mot dans le titre soit devant la ligne avec le mot dans le message lors du résultat, ou ça va se faire tout seul ?


    Et l'expression, "WITH QUERY EXPANSION", c'est efficace ça, ça marche bien ? Y'a d'autres propriété que je ne connaitrais pas qui sont interessantes ?

  16. #16
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par johann51 Voir le message
    Mais si mon mot est présent une fois dans le titre pour une ligne, et une fois dans le message pour l'autre ligne, est-ce qu'il y'a une technique pour que la ligne avec le mot dans le titre soit devant la ligne avec le mot dans le message lors du résultat, ou ça va se faire tout seul ?
    qqch comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * 
    FROM `annonces` 
    WHERE MATCH (`titre`,`message`) AGAINST ('$mots')
    ORDER BY MATCH (`titre`,`message`) AGAINST ('$mots'),
      MATCH (`titre`)` AGAINST ('$mots'),
      MATCH (`message`) AGAINST ('$mots')
    mais ça suppose que tu aies les trois index sur titre, message et titre/message.
    Citation Envoyé par johann51 Voir le message
    Et l'expression, "WITH QUERY EXPANSION", c'est efficace ça, ça marche bien ? Y'a d'autres propriété que je ne connaitrais pas qui sont interessantes ?
    Jamais utilisée en vrai.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Si quelqu'un tape un mot au singulier par exemple (voiture), dans le résultat de la requête utilisant Match ... Against, il n'y aura que les lignes contenant "voiture", et les lignes contenant "voitures" seront ignorées. J'ai essayé avec des *, %, ?, apparemment ça ne marche pas.

    Y'a t-il une solution pour les afficher, toujours en utilisant Math ... Against pour garder une certaine pertinence ?

  18. #18
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    tout bêtement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE MATCH (`titre`,`message`) AGAINST ('voiture voitures')
    si tu tiens aux jokers, tu peux utiliser *, mais seulement en mode booléen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE MATCH (`titre`,`message`) AGAINST ('voiture*' IN BOOLEAN MODE)

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 18
    Par défaut
    Citation Envoyé par Antoun Voir le message
    tout bêtement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE MATCH (`titre`,`message`) AGAINST ('voiture voitures')
    si tu tiens aux jokers, tu peux utiliser *, mais seulement en mode booléen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE MATCH (`titre`,`message`) AGAINST ('voiture*' IN BOOLEAN MODE)

    Merci pour tes réponses.

    Sinon, c'est dommage que ça ne marche que dans le 2e cas, car là, la pertinence n'y est plus.

    Le premier cas ne détecte même pas les mots précédé par exemple d'un l'

    Existe t-il une solution plus efficace que le match against pour faire son moteur de recherche ?

  20. #20
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par johann51 Voir le message
    Existe t-il une solution plus efficace que le match against pour faire son moteur de recherche ?
    ça dépend ce que tu entends par "efficace" ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. pb de requête avec MATCH AGAINST
    Par Romain_marine dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/05/2010, 11h30
  2. requete mystérieuse avec Match against
    Par nicolasferraris dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/02/2009, 18h06
  3. recherche dans une base mysql avec match against
    Par devdebutante dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/07/2008, 14h42
  4. Prise en charge accents avec Match/against [BUG]
    Par numa1985 dans le forum Requêtes
    Réponses: 0
    Dernier message: 26/02/2008, 09h15
  5. Probleme avec "match against"
    Par biggione dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/03/2007, 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