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 :

Moteur de recherche


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 145
    Par défaut Moteur de recherche
    Je suis en train de travailler sur un p'tit moteur de recherche pour mon site et je cherche a l'améliorer un peu.

    Actuellement, il cherche uniquemement la présence de tout les mot rechercher dans les entré de ma base de donnée.

    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
     
    $t_search = explode(" ",$search);
    $c_search = count($t_search);
     
    $sql="
    SELECT * 
    FROM rubriques 
    WHERE ";
     
    for($i=0;$i<$c_search;$i++){
    	if($i != 0){
    		$sql.=" AND ";
    	}
            $sql.= "(
            rubrique LIKE '%" . $t_search[$i] . "%'
            OR cle LIKE '%" . $t_search[$i] . "%' 
            )";
    }
    Mais j'aimerai lui permettre, dans l'hypothèse que la chaine recherché comporte 4 mots par exemple, qui me donne aussi les réponses qui comporte que 3 mots, 2mots et 1mot de l'expression recherché, trié dans le sens decroissant du nom de mot recherché bien sur.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Par défaut
    Salut,

    tu devrais fureter du côté du fulltext index pour mysql, ça pourrait t'aider.

    En gros, tu n'utilises pas les clauses like mais plutôt MATCH ([champs]) AGAINST ('[critères]'). Les résultats sont triés par ordre de pertinence (une valeur est attribuée à chaque ligne). Pour cela, ta table doit être MyISAM et contenir un FULLTEXT INDEX comprenant les champs prévus poru la recherche.

    Tu trouveras très vite des docs sur le sujet sur le site de MySQL, onglet communauté.

    J'éspère que ça t'aidera.

  3. #3
    Membre expérimenté
    Avatar de maxime.ohayon
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 113
    Par défaut moteur de recherche
    Le moteur de recherche dans un site c'est toujours quelques chose de délicat, en effet soit tu fait une simple recherche mais finalement la recherche n'est pas souvent très réussite.

    La meilleure solution est un peu lourde et difficile à mettre en place c'est de créer une tables qui contient pour chaque article, page de ton site les mots clés qui y sont attachés avec un degré de pertinance.

    De plus le full-text index n'est pas toujours satisfaisant dans mysql.

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 145
    Par défaut
    Le fulltext à l'aire de convenir a ma demande mais il me pause problème lors de requète un peu plus complexe :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    $sql="
    SELECT ets.nom,(6366 * acos(cos(".$lat.") * cos(communes.lat_rad) * cos(communes.long_rad - ".$long.")+sin(".$lat.") * sin(communes.lat_rad))) AS distance
    FROM ets 
    LEFT JOIN communes ON communes.insee = ets.ville
    LEFT JOIN rubriques AS rub1 ON rub1.id = ets.rub1 
    LEFT JOIN rubriques AS rub2 ON rub2.id = ets.rub2 
    LEFT JOIN rubriques AS rub3 ON rub3.id = ets.rub3 
    WHERE "; 
     
    for($i=0;$i<$c_search;$i++){
    	if($i != 0){
    		$sql.=" AND ";
    	}
    	$sql.= "(
    	ets.nom LIKE '%".$t_search[$i]."%' 
    	OR ets.obs LIKE '%".$t_search[$i]."%' 
    	OR ets.cle LIKE '%".$t_search[$i]."%' 
    	OR rub1.rubrique LIKE '%".$t_search[$i]."%'
    	OR rub1.cle LIKE '%".$t_search[$i]."%'
    	OR rub2.rubrique LIKE '%".$t_search[$i]."%'
    	OR rub2.cle LIKE '%".$t_search[$i]."%'
    	OR rub3.rubrique LIKE '%".$t_search[$i]."%'
    	OR rub3.cle LIKE '%".$t_search[$i]."%'
    	OR communes.ville LIKE '%".$t_search[$i]."%'
    	)";
    }
     
    if($test_km == 1){
    	$sql.= " ORDER BY distance";
    }
    info sur le code : chaque etablissement (ets) peu avoir 3 rubrique d'ou les 3 jointure avec la table rubrique.
    Le champ distance est un calcul entre les coordonées de la ville de l'etablissement et la ville de l'utilisateur.


    Plusieur clause Match() sont elle possible dans la même requète ?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Par défaut
    A priori, ça ne devrait pas poser de problèmes. Je n'ai jamais rencontré de difficulté jusqu'à présent mais ton exemple est assez élaboré donc je ne m'avance pas plus.

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    145
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 145
    Par défaut
    Bon, après d'autre test, Match ne conviens pas, explication :

    Si je recherche "taxi" et que dans ma base, il y a que des "taxis", bah il trouve pas, idem si je cherche "hotel" et que ma base contien "hôtel"

    Bon, sinon, j'avais une solution de dernier recourt mais c'est mon serveur qui va pas être heureux, je la donne quand même, peut être que ca donnera des idées.

    Je fait une premiere recherche avec tout les mot (on va partir sur une recherche de 3mots), une 2eme avec uniquement le 1eme et 2eme mot, une 3eme avec le 1er et le 3eme, une autre avec le 2eme et le 3eme... et ainsi de suite mais je vous laisse imaginé le nombre de requète néssésaire avec une recherche de 10mots LOL donc je vais evité par pitié pour mon serveur.

Discussions similaires

  1. [Info]moteur de recherche full text en environnement j2ee
    Par ddams dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/11/2004, 19h39
  2. comment faire ma base de donnée pour un moteur de recherche
    Par HoB dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 04/05/2004, 15h07
  3. Moteur de recherche par date
    Par Prue dans le forum ASP
    Réponses: 17
    Dernier message: 27/08/2003, 16h07
  4. [Technique] Index, comment font les moteurs de recherche ?
    Par bat dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 25/10/2002, 15h41

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