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 en FULLTEXT [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 106
    Par défaut recherche en FULLTEXT
    Bonjour,

    J'ai un petit souci avec mes requêtes de recherche en fulltext.
    J'ai suivi l'exemple suivant : http://omiossec.developpez.com/mysql/fulltext/etudes/
    et j'ai donc créé ma table :
    Code SQL : 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 `pieces` (
      `Id` int(11) NOT NULL auto_increment,
      `Ref` varchar(20) NOT NULL default 'NEW',
      `Cat` varchar(255) NOT NULL default 'NEW',
      `Nom` varchar(255) NOT NULL default 'Nouvelle fiche',
      `Description` text character set utf8 collate utf8_unicode_ci NOT NULL,
      `Photos` text character set utf8 collate utf8_unicode_ci NOT NULL,
      `Poids` float(11,2) NOT NULL default '0.00',
      `Prix` float(11,2) NOT NULL default '0.00',
      `Stock` tinyint(11) NOT NULL default '0',
      `Actif` tinyint(4) NOT NULL default '0',
      PRIMARY KEY  (`Id`),
      FULLTEXT KEY `Ref` (`Ref`,`Nom`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Table des pièces détachées' AUTO_INCREMENT=9 ;
     
    -- 
    -- Contenu de la table `pieces`
    -- 
     
    INSERT INTO `pieces` VALUES (3, 'NEW', 'NEW', 'Nouvelle fiche', 'Desc nouvelle fiche', '', 0.00, 0.00, 0, 0);

    Puis mon code php pour tester ma requete :
    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
     
    $tosearch = 'NEW';
    $strSQL = "SELECT Ref, MATCH (Nom, Ref) AGAINST ('".$tosearch."') AS  cpt
    		FROM pieces
    		WHERE MATCH (Nom, Ref) AGAINST ('".$tosearch."')
    		ORDER BY cpt DESC";
    $resultat = requete_SQL($strSQL);
    $retour = '';
    if(mysql_num_rows($resultat)==0) {
     echo 'pas de résultats';
    }
    while($result = mysql_fetch_array($resultat)) {
    	$retour.=$result['Ref'].'<br />';
    }
    echo $retour;
    Et là je n'ai aucun résultat...

    Pourtant, si je suis à la lettre le tuto avec la table proposée, ça marche sans aucun souci.

    Quelqu'un aurait une idée du pourquoi ma requête ne me retourne pas de résultat ?

    Merci d'avance pour votre aide précieuse

  2. #2
    Membre Expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Par défaut

    Tu as essayé d'afficher la requête que tu envoies au SGBD et de l'exécuter directement dans MySQL afin de voir si ton problème vient de la requête même ou du code PHP ?

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Bonjour,

    Par défaut Mysql n'indexe pas les mots de moins de 4 caracteres, donc 'NEW' n'est pas pris en compte.
    Tu peux changer cela en modifant la valeur de ft_min_word_len dans ton my.cnf (il faut ensuite recreer l'index).
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 106
    Par défaut
    Trotters :

    Oui j'ai essayé de la passer directement. Elle passe sans erreur mais je n'ai aucun résultat.

    sabotage :

    Avant de changer le paramétrage de mysql, j'ai entré le mot 'fiche' dans la table.
    J'ai ensuite repassé ma requete en recherchant le mot 'fiche', et toujours aucun résultat.
    Je suppose donc que, malheureusement, le problème ne vient pas de là non plus

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 106
    Par défaut
    Visiblement, au niveau du code php il n'y a pas de soucis. J'ai dû quelque part me tromper en créant la base, mais je ne vois vraiment pas ou, rien n'y fait !

    J'ai essayé de réparer la table pour reconstituer les index, mais ça n'a rien changé.

    Lorsque je passe la requête directement sous phpmyadmin, je ne trouve aucun résultat.

    voilà la requête actuelle de la table lorsque je l'exporte :

    Code pieces.sql : 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
    22
    23
    24
    25
    26
    27
     
    CREATE TABLE `pieces` (
      `Id` int(11) NOT NULL auto_increment,
      `Ref` varchar(20) NOT NULL default 'NEW',
      `Cat` varchar(255) NOT NULL default 'NEW',
      `Nom` varchar(255) NOT NULL default 'Nouvelle fiche',
      `Description` text character set utf8 collate utf8_unicode_ci NOT NULL,
      `Photos` text character set utf8 collate utf8_unicode_ci NOT NULL,
      `Poids` float(11,2) NOT NULL default '0.00',
      `Prix` float(11,2) NOT NULL default '0.00',
      `Stock` tinyint(11) NOT NULL default '0',
      `Actif` tinyint(4) NOT NULL default '0',
      PRIMARY KEY  (`Id`),
      FULLTEXT KEY `Ref` (`Ref`,`Nom`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Table des pièces détachées' AUTO_INCREMENT=9 ;
     
    -- 
    -- Contenu de la table `pieces`
    -- 
     
    INSERT INTO `pieces` VALUES (3, 'NEW fiche', 'NEW', 'Nouvelle fiche NEW', 'Desc nouvelle fiche', '', 0.00, 0.00, 0, 0);
    INSERT INTO `pieces` VALUES (2, 'NEW', 'NEW', 'Nouvelle fiche', 'Desc nouvelle fiche', '', 0.00, 0.00, 0, 0);
    INSERT INTO `pieces` VALUES (4, 'NEW', 'NEW2', 'Nouvelle fiche', 'Desc nouvelle fiche', '', 0.00, 0.00, 0, 0);
    INSERT INTO `pieces` VALUES (5, 'NEW', 'NEW', 'Nouvelle fiche', 'Desc nouvelle fiche', '', 0.00, 0.00, 0, 0);
    INSERT INTO `pieces` VALUES (6, 'NEW', 'NEW', 'Nouvelle fiche', 'Desc nouvelle fiche', '', 0.00, 0.00, 0, 0);
    INSERT INTO `pieces` VALUES (7, 'NEW', 'NEW', 'Nouvelle fiche', 'Desc nouvelle fiche', '', 0.00, 0.00, 0, 0);
    INSERT INTO `pieces` VALUES (8, 'NEW', 'NEW', 'Nouvelle fiche', 'Desc nouvelle fiche', '', 0.00, 0.00, 0, 0);

    Est-ce que les experts repèrent une erreur quelque part ? Ou dans ma requête de recherche (toujours la même que ci-dessus, j'ai juste changé pour recherche le mot 'fiche', plus long) ?

  6. #6
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut,

    peut être un problème de collation?

    de plus, le mot fiche apparait trop souvent. Il doit être présent dans moins de 50% des lignes

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Cybher a evidemment raison :
    De cette façon, un mot présent dans de nombreuses lignes aura un poids faible (et peut être même un poids nul), car il a peu d'importance dans cette requête particulière. Au contraire, si le mot est rare, il recevra un poids fort. Le poids des mots sont alors rassemblés pour calculer la pertinence de la ligne.

    Avec les toutes petites tables, la distribution des mots ne reflète par correctement leur valeur sémantique et ce modèle peut parfois produire des résultats étranges.

    mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
    Empty set (0.00 sec)

    La recherche du mot MySQL ne donne aucun résultat dans l'exemple précédent, car il est présent dans plus de la moitié des lignes.
    Si tu veux valoriser la présence du mot et non le critere de pertinence, fait une recherche IN BOOLEAN MODE
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 106
    Par défaut
    C'est exactement ça, j'ai trouvé la solution.
    En fait, d'un coté on ne peut rechercher, par défaut, un mot de moins de 4 lettres. C'était une des raisons de mon échec au départ.

    D'autre part, le fait que le mot 'fiche' était trop présent dans la base rendait en effet le résultat nul (ce qui, en revanche, n'était pas le cas IN BOOLEAN MODE).

    En bref j'ai accumulé les erreurs, rendant la solution pas si simple à trouver que ça

    En tous cas, merci à vous pour votre aide précieuse !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherches en FULLTEXT ?
    Par tryan dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/10/2010, 14h31
  2. [MySQL] ignorer certains mots dans la recherche en fulltexte
    Par Abou Zar dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/03/2010, 09h26
  3. moteur de recherche avec FULLTEXT
    Par webdesignswiss1000 dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/08/2009, 17h18
  4. Réponses: 3
    Dernier message: 02/10/2008, 12h37
  5. Problème avec la recherche en fulltext
    Par pepelele dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/05/2007, 14h32

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