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 :

Soucis sur recherche FULLTEXT [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Par défaut Soucis sur recherche FULLTEXT
    Bonjour,

    J'ai un petit soucis concernant les recherches en FULLTEXT que je ne comprend pas. En gros, certaines recherches fonctionnes alors que d'autres pas.

    En gros :

    Table TOTO contenant plusieurs champs dont 2 nommés "titre_annonce" et "texte_annonce" en "FULLTEXT".

    Je récupère les mots recherchés pour les traiter :
    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
    <?php
    if(!empty($_GET['key'])){
    	$variableclef = trim(stripcslashes(htmlspecialchars($_GET["key"])));
        //On recupère la recherche mot par mot
    	$motclef = explode(" ",$variableclef);
    	//on compte le nombre de mot
    	$num = count($motclef);
    	//on boucle
    	for( $i = 0; $i < $num; $i++ )
    	{
    		//Recherche de type : '+mot1 +mot2 +mot3'
    		//cf : http://dev.mysql.com/doc/refman/5.0/fr/fulltext-boolean.html
    		$recherche .= '+'.$motclef[$i].' ';
    	}
    //on échappe les simples quote
    $recherche = str_replace("'" ,"\'",$recherche);
    }
    ?>
    A ce stade si j'entre par exemple la recherche "moteurs de recherches" mon code donne comme résultat : "+moteurs +de +recherches" donc normalement une recherche sur les 3 mots.

    Code sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    $query=mysql_query("SELECT * FROM TOTO WHERE valide='1' AND prix LIKE '".$_GET['prix']."%' AND MATCH (titre_annonce,texte_annonce) AGAINST ('".$recherche."')"); 
    ?>
    En bd est enregistré plusieurs exemples dont les titres suivants (champ:" titre_annonce") :
    moteurs de recherches
    recherche maison noirmoutier
    et 5 titres contenant le mot "annonce" (annonce ou l'annonce).

    Si je cherche les termes : "moteurs de recherches" ou "moteurs" ou "recherches", je n'ai aucun résultat.

    Si je cherche les termes : "recherche maison noirmoutier" ou "recherche" ou " maison" ou "noirmoutier", j'ai des résultats.

    Si je recherche le terme : "annonce", je n'ai aucun résultat bien qu'il soit présent 5 fois.

    Si je cherche le terme : "l'annonce", j'ai 3 résultats sur 5.

    Ce que je ne comprend pas, c'est pourquoi parfois je n'ai pas de résultat bien que les termes soient présent ou qu'ils me manque une partie des résultats ?

    Nota: ma version sql doit contenir un minimum de 4 lettres pour les recherches.

    Merci

  2. #2
    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
    Pour un élément de réponse : les apostrophes ne sont prises en compte qu'a partir de mysql 5.1
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Par défaut
    Ok pour les apostrophes mais concernant le reste, une idée sur le pourquoi "ça merdouille"?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    pourquoi tu fais un htmlspecialchars ? tes données sont en entités dans ta base ?

    EDIT : et pourquoi utiliser for au lieu de foreach ? d'ailleur autant replacer les espaces par espace +

  5. #5
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TOTO WHERE valide='1' AND prix LIKE '".$_GET['prix']."%' AND MATCH (titre_annonce,texte_annonce) AGAINST ('".$recherche."' IN BOOLEAN MODE)

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Par défaut
    Pour htmlspecialchars c'est juste pour éviter certains caractères html que pourrait s'amuser à rentrer certaines personnes. Pourquoi, ce n'est pas correcte?

    tes données sont en entités dans ta base ?
    C'est à dire?

    Les données sont enregistrées via un simple textarea sur lequel j'effectue certains contrôle avant enregistrement.

    J'ai remplacé la boucle for par foreach, supprimé htmlspecialchars mais ça ne change rien.

    Pourquoi remplacer les espaces par espace+ ? Je ne vois pas l'intérêt de faire une recherche sur un espace ??

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par tryan Voir le message
    Pour htmlspecialchars c'est juste pour éviter certains caractères html que pourrait s'amuser à rentrer certaines personnes. Pourquoi, ce n'est pas correcte?


    C'est à dire?

    Les données sont enregistrées via un simple textarea sur lequel j'effectue certains contrôle avant enregistrement.

    J'ai remplacé la boucle for par foreach, supprimé htmlspecialchars mais ça ne change rien.

    Pourquoi remplacer les espaces par espace+ ? Je ne vois pas l'intérêt de faire une recherche sur un espace ??
    le htmlspecialschars c'est uniquement en moment de l'affichage, c'est pas bien de la faire dans tes requête :
    si la personne ecrit : héhé,
    dans la requete ca doit etre héhé,
    dans la base héhé,
    et à l'affichage h&ecute;h&ecute; (et encore normalement c'est que pour les < > )


    Citation Envoyé par tryan Voir le message
    Pourquoi remplacer les espaces par espace+ ? Je ne vois pas l'intérêt de faire une recherche sur un espace ??
    si la personne recherche : machin bidule truc
    ton code va faire : +machin +bidule +truc
    tu vois bien que finalement les espace sont remplacer par espace+

    meme si c'est un peu plus complexe que ca le principe y est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $str = 'machin bidule truc';
    echo '+', str_replace(' ', ' +', $str);
    //+machin +bidule +truc

  8. #8
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Par défaut
    Citation Envoyé par tryan Voir le message
    Pourquoi remplacer les espaces par espace+ ? Je ne vois pas l'intérêt de faire une recherche sur un espace ??
    Afin de gérer le cas du premier mot, tu enlève ta concaténation
    Ainsi tu aura au final :

    Au lieu de


  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Par défaut
    Désolé, je ne suis pas une flèche et je teste en même temps .

    @gwharl : bingo . En ajoutant "IN BOOLEAN MODE", j'ai tout mes résultats, merci.

    Merci pour tes explications également @stealth35 .

    Il y a un truc que je ne pige pas concernant la recherche. Doit elle aboutir sous la forme :

    mot1 +mot2 +mot3
    ou
    mot1+mot2+mot3
    ou (cas des espaces)
    mot1 + +mot2 ++mot3
    ou
    mot1++mot2++mot3

    @gwharl : Dans la doc il est dit : "signe + initial indique que le mot doit être présent dans la ligne retournée. " et dans ton code tu supprimes justement le premier + ... pourquoi ?

  10. #10
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Par défaut
    Citation Envoyé par tryan Voir le message
    @gwharl : Dans la doc il est dit : "signe + initial indique que le mot doit être présent dans la ligne retournée. " et dans ton code tu supprimes justement le premier + ... pourquoi ?
    Et bien je ne suis pas expert dans le MATCH AGAINST mais il me semble que le premier "+" n'est pas obligatoire (à confirmer).

    EDIT : Après quelques recherches il semble que le premier "+" soit effectivement indispensable, c'est une erreur de ma part.

  11. #11
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Par défaut
    Oki , et concernant les recherches, je dois prendre en considération les espace ou pas ?

    Par exemple pour le terme : "location de vacances" :

    J'ajoute un + devant chaque mot en laissant les espaces
    +location +de +vacances
    J'ajoute un + et je supprime les espaces
    +location+de+vacances
    J'ajoute un + pour chaque espace en conservant les espaces entre chaque mot :
    +location + +de + +vacances
    J'ajoute un + pour chaque espace en supprimant l'espace entre chaque mot :
    +location++de++vacances

    Bon, la question peut sembler stupide mais dans le doute ...

  12. #12
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Par défaut
    Citation Envoyé par tryan Voir le message
    J'ajoute un + devant chaque mot en laissant les espaces
    +location +de +vacances

  13. #13
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Par défaut
    Merci @gwharl, je m'en doutais un peut ^^.

    Je vous enquiquine encore un peut car je survole la doc sur ce sujet et je me demande si il n'est pas mieux de laisser le choix aux internautes dans leurs recherches. Je m'explique; en ajoutant les + automatiquement, j'oblige la recherche sur des termes bien précis et quand je vois tout les opérateurs que l'on peut utiliser pour "optimiser" les recherches, je me demande si à la final il ne vaut pas mieux laisser le choix aux internautes d'utiliser eux mêmes les opérateurs dans leurs recherches (avec une petite explication)?

  14. #14
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Par défaut
    A mon avis non, c'est ton rôle justement de gérer ça, il faut te dire que l'internaute veut que ce soit au plus simple et qu'il ne veut pas se prendre la tête pour une simple recherche à mettre des "+", "-" etc...

  15. #15
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Par défaut
    Ouai je sais que l'internaute est "feignant" par défaut mais entre "imposer" la recherche par le signe + qui effectue une recherche "stricte" et proposer diverses options, perso je fais le choix 2.
    Je pense que je vais supprimer l'opérateur + de mon code pour une recherche plus "souple" et proposer des "options" pour des recherches plus "approfondies".

    Merci à vous d'avoir prit le temps de me répondre

    Cdt

  16. #16
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Je pense que je vais supprimer l'opérateur + de mon code pour une recherche plus "souple" et proposer des "options" pour des recherches plus "approfondies".
    Regarde la page de "recherche avancée" de Google, tu verras qu'ils proposent une sorte de compromis.

    Il y a 4 zones de texte pour lister des mots clés :
    1 pour les ET
    1 pour les OU
    1 pour égalité (=)
    1 pour exclure (!=)

    Pour faire un moteur de recherche avancé uniquement basé sur la chaine saisie par les utilisateurs, c'est rude tout de même.

    Ca ne se résume pas à faire des + et -, mais pour des combinaisons, il faut des parenthèses, de la nuance, etc ...

    Ex : location ET de ET (vacances OU tourisme) SANS (affaire ET business)


    Personnellement, j'ai opté pour une page "recherche avancée" en proposant plusieurs différents formulaires.
    Un formulaire avec l'alphabet, donc uniquement des mots commençant A, B, C, etc ...

    Puis plusieurs combinaisons de critères qui ont été intégrés pour ça justement.
    (par thèmes, catégories, etc ...)
    Tout l'art (et prise de tête, faut l'dire) est de classer les données dans de multiples critères, des filtres en faite, qui au bout permettront de cibler un ensemble d'articles de manières bien plus intuitive.
    Pour beaucoup ce sont des cases à cochées.


    En tout cas, je partage l'avis de gwharl, très rare sont ceux qui exploiteront un moteur de recherche aussi complexe, pour des utilisateurs, faut leur mâcher le travail.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/04/2015, 14h14
  2. [RegEx] souci sur une recherche dans une chaine
    Par fey dans le forum Langage
    Réponses: 8
    Dernier message: 21/10/2009, 15h58
  3. Question sur la recherche FULLTEXT
    Par Rudya dans le forum Langage SQL
    Réponses: 1
    Dernier message: 31/05/2007, 11h44
  4. [SQL] probleme sur recherche
    Par Tib781 dans le forum Access
    Réponses: 2
    Dernier message: 19/05/2005, 12h31
  5. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06

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