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

Langage PHP Discussion :

Recherche FULLTEXT


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Par défaut Recherche FULLTEXT
    Re Bonjour tout le monde
    Je reviens encore avec mes problèmes (il y en a un autre et se serra fini )

    J'ai créer une petit moteur de recherche en FULLTEXT (et LIKE si l'on veut rajouter des critères à la recherche)
    Bon bref c'est pas terrible et je suis consient de pas être un pro du PHP.
    MAIS et je dis bien mais, un problème persiste.

    La recherche fonctionne, SAUF sur un client (et seulement 2 caractère je ne sais pourquoi)

    Je vous explique :

    Voici 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
    22
    23
     
    CREATE TABLE `clients` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `categorie` varchar(200) default NULL,
      `nom` varchar(200) default NULL,
      `prenom` varchar(200) default NULL,
      `profession` varchar(200) default NULL,
      `societe` varchar(200) default NULL,
      `adresse` varchar(200) default NULL,
      `adresse2` varchar(200) default NULL,
      `codepostal` varchar(200) default NULL,
      `ville` varchar(200) default NULL,
      `fixe` varchar(200) default NULL,
      `fax` varchar(200) default NULL,
      `portable` varchar(200) default NULL,
      `fonction` varchar(200) default NULL,
      `site` varchar(200) default NULL,
      `mail` varchar(200) default NULL,
      `commentaire` text,
      `idnom` int(11) NOT NULL,
      PRIMARY KEY  (`id`),
      FULLTEXT KEY `nom` (`categorie`,`nom`,`prenom`,`profession`,`societe`,`adresse`,`adresse2`,`codepostal`,`ville`,`fixe`,`fax`,`portable`,`fonction`,`site`,`mail`,`commentaire`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4267 ;

    Et Voici l'endroit ou ça foire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (43, 'Particulier', 'Bidddl', 'Mil Ldeuc', NULL, NULL, '2 rue des nouilles patates frite', '', '66600', 'Moulinlaville', '0376564657', NULL, '', NULL, NULL, 'jl.bihll@mangerlesfrite.zo', 'Famille\r\n', 37),
    Lorsque je recherche "jl", il ne me trouve pas l'adresse mail (même si l'on remplace "jl" par "yu" ou n'importe quoi qui à 2 caractère) Par contre si je recherche "bihll" ou "mangerlesfrite" il me retourne bien l'adresse mail....
    Alors que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (1, 'Particuliers', 'Badouhe', 'Cladee', NULL, NULL, '21 bis nan tu sauras pas', '', '57950', 'Icibas', '0344444444', NULL, '0666666666', NULL, NULL, 'cl.bau
    zer@free.fr', 'Famille\r\n', 28),
    ici si l'on recherche "cl" il retourne bien l'adresse mail !!!


    Au cas ou voici un bout d'mon code php (la partie requete pour la recherche)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if ($zcrite=='znom'){
    $requetemysql = "SELECT *  FROM ".$table." WHERE nom LIKE \"%".$recherche."%\"";
    }
    elseif ($zcrite=='zprenom') {
    $requetemysql = "SELECT *  FROM ".$table." WHERE prenom LIKE \"%".$recherche."%\"";
    }
    elseif ($zcrite=='zvillez'){
    $requetemysql = "SELECT *  FROM ".$table." WHERE ville LIKE \"%".$recherche."%\"";
    }
    else{
    $requetemysql = 'SELECT *  FROM '.$table.' WHERE MATCH (categorie,nom,prenom,profession,societe,adresse,adresse2,codepostal,ville,fixe,portable,fonction,mail,commentaire ) AGAINST(\''.$recherche.'*\'IN BOOLEAN MODE)';
    }
    Je n'ai vraiment aucune idée pourquoi il ne veut pas chercher dans cette foutu ligne les 2 caratères avant le point de l'adresse mail...

    Merci beaucoup à vous tous

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2002
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 194
    Par défaut
    extrait du manuel mysql en ligne dans une partie qui parle de MATCH... AGAINST

    MySQL utilise un filtre très simple pour séparer le texte en mots. Un "mot" est n'importe quelle chaîne de caractères constituée de lettres, chiffres, ‘'’ et ‘_’. Tout "mot" présent dans la liste des mots à ignorés ou qui est trop court (3 caractères ou moins) est ignoré.

    cl est trop court je dirais

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Par défaut
    La recherche est en BOOLEAN donc pas de problème au niveau du nombre de caractère.

    Et si la recherche était trop courte pourquoi alors trouver une autre ligne lorsque je recherche "cl" (regarde mon post de départ tu comprendras mieux)

    Merci quand même

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2002
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 194
    Par défaut
    et il te renvoit autre chose?
    il se pourrait qu'un autre enregistrement corresponde mieux...


    ou alors essaye de mettre dans les autres champs des . histoire de voir si jamais ce ne serait pas le . qui gènerait pour la recherche...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Par défaut
    Non le . ne dérange pas puisqu'avec le 2 eme exemple que je vous donne ça marche.
    Et même si je change les 2 caractère du premier exemple ça ne marche pas.

    Et pour reprendre mon premier post :

    (1, 'Particuliers', 'Badouhe', 'Cladee', NULL, NULL, '21 bis nan tu sauras pas', '', '57950', 'Icibas', '0344444444', NULL, '0666666666', NULL, NULL, 'cl.bau
    zer@free.fr', 'Famille\r\n', 28),

    La recherche avec "cl" fonctionne parfaitement

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2004
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 496
    Par défaut
    Salut,

    jpose toujours la question au cas où.. est-ce que tu fais des echo de tes requêtes pour les tester directement dans phpMyAdmin?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Par défaut
    Oui bien sur

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2004
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 496
    Par défaut
    J'ai été relire la doc et ils ne disent nulle part que les mots de 3 lettres ou moins ne sont pas ignorés en mode Boolean...

    Ce qui est donc bizarre c'est qu'il te renvoie des résultats pour la recherche 'cl'...

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2002
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 194
    Par défaut
    la requête renvoit quelquechose ou rien?
    on sait qu'elle ne renvoit pas ce qu'il faut, mais ça donne quoi ?

    un autre enregistrement avec les lettres?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Par défaut
    La requete ne renvoie rien.
    Non pas d'autre enregistrement apparement (même avec LIKE)

    La requête :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT *
    FROM clients
    WHERE MATCH (
    categorie, nom, prenom, profession, societe, adresse, adresse2, codepostal, ville, fixe, portable, fonction, mail, commentaire
    )
    AGAINST (
    'jl*'
    IN BOOLEAN
    MODE
    )
    LIMIT 0 , 30

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Par défaut
    Hum en fait il trouve les autre ligne car "cl" par exemple est présent ailleur que dans le champs mail.

    L'opérateur * ne match pas les "."

    Y aurait-il une astuce ?

    (sans reconfigurer le nombre de caractère minimum admis dans la recherche FULLTEXT svp...)

  12. #12
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Je reformule ta recherche ainsi : "trouver dans une série de colonne si au moins l'une d'entre elle contient un mot commençant par jl et pouvant contenir les divers caractères admis dans une adresse e-mail (donc pas d'espace)".

    Si ma définition est bonne, tu peux utiliser une expression régulière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WHERE CONCAT_WS(' ',
      categorie, nom, prenom, profession, societe, adresse, 
      adresse2, codepostal, ville, fixe, portable, fonction, 
      mail, commentaire
    )
    REGEXP '[[:<:]]jl[^[:blank:]]*[[:>:]]'
    J'explicite un peu :
    • [[:<:]] : début de mot
    • [^[:blank:]]* : une série de caractères non-blancs (différents de espace, tabulation, retour chariot, etc.)
    • [[:>:]] : fin de mot

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Par défaut
    Merci beaucoup à toi (dommage que je ne maitrise pas REGEXP ça a l'air très puissant !)

    J'ai donc reformulé ma requete qui maintenant est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT *  FROM '.$table.' WHERE CONCAT_WS (categorie,nom,prenom,profession,societe,adresse,adresse2,codepostal,ville,fixe,portable,fonction,mail,commentaire ) REGEXP \'[[:<:]]jl[^[:blank:]]*[[:>:]]\'  AGAINST(\''.$recherche.'*\'IN BOOLEAN MODE ORDER by prenom DESC LIMIT '.$limite.','.$nombre.'
    Mais ça ne marche pas

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AGAINST('hl*'IN BOOLEAN MODE)' at line 1
    Je ne suis pas près à apprendre le REGEXP tout de suite (car je préfère maitriser d'autre chose en PHP et approfondir mes connaissances sur d'autre points) mais je m'y metterais ça c'est sur !

    En attendant je te demande un peu d'aide de se côté.
    Bien sur je peux comprendre que tu n'ais pas envie de refaire ma requête et te prendre la tête la dessus

    Encore une fois merci (à toi et à vous tous ! )

  14. #14
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Les regex n'ont rien à voir avec la recherche FULLTEXT. Il n'y a donc ni AGAINST ni BOOLEAN MODE avec REGEXP, et il faudra que tu isoles le cas hl* de ceux que tu veux traiter avec MATCH.

    Pour ce qui est de la syntaxe à utiliser, c'est pile poil celle que je t'ai donnée : CONCAT_WS(' ', colonnes) REGEXP 'expression'.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 26
    Par défaut
    Voici ma requête maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     if ($nbs_car==2){
     $requetemysql = "SELECT *  FROM ".$table." WHERE CONCAT_WS(' ', categorie, nom, prenom, profession, societe, adresse, adresse2, codepostal, ville, fixe, portable, fonction, mail, commentaire)
    REGEXP '[[:<:]]jl[^[:blank:]]*[[:>:]]'";
     }
     
    $req = mysql_query(''.$requetemysql.' ORDER by NULL DESC LIMIT '.$limite.','.$nombre.'')or exit(mysql_error());
    Il trouve bien les 2 caractère seulement il fait la recherche sur le seul et même résultat maintenant.

    Je dis qu'il fait bien la recherche car mon script surligne le résultat...
    Et même si les 2 caractère n'apparaisse pas il affiche le même résultat

  16. #16
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Citation Envoyé par izbing
    Il trouve bien les 2 caractère seulement il fait la recherche sur le seul et même résultat maintenant.

    Je dis qu'il fait bien la recherche car mon script surligne le résultat...
    Et même si les 2 caractère n'apparaisse pas il affiche le même résultat
    Euh... ça veut dire que c'est OK ou qu'il reste un problème ? (et dans ce cas, lequel ?)

  17. #17
    Invité de passage
    Profil pro
    Inscrit en
    Février 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 1
    Par défaut
    Bonjour, voici un script en php 5 qui permet de faire ce genre de recherche fulltext, avec résultats par pertinence, sans charger le serveur mysql ni la mémoire allouée aux scripts php (fonctionne avec des regexp).

    Moteur de recherche fulltext en php 5

    Il faut juste configurer les tables à scanner et quelques autres choses.

Discussions similaires

  1. Problème avec la recherche FULLTEXT
    Par izbing dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/01/2008, 23h13
  2. recherche fulltext et "&"
    Par chicobra dans le forum Requêtes
    Réponses: 3
    Dernier message: 27/11/2006, 10h52
  3. 1 base InnoDB et 1 base MyISAM pour recherche fulltext
    Par babarincairo dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 23/06/2006, 10h25
  4. recherche fulltext : mot non trouvé
    Par sam01 dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/05/2006, 15h03
  5. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/05/2004, 00h06

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