Forum Programmation.php Pertinence reqete sql

Posté par  .
Étiquettes : aucune
0
20
avr.
2005
Yep tout le monde !

Bon j'aimerais pouvoir rendre mes requetes plus pertinente !
J'ai une sorte de mini moteur de recherche en php qui tappe dans une base de donnée Mysql.
Comment afficher mes résultats en fonction de leur pertinence ?
Ex :
On recherche tous les livres contenant les mots : php, mysql, pertinence
J'aimerais donc afficher en premier les livres qui contiennent les 3 mots, soit dans leurs titres ou dans leurs description, puis ceux qui contiennent que 2 mots puis ceux qui en ont qu'un seul !

Merci de votre aide.
P.S: Sachant que s'est un moteur de recherche à la base, je ne maîtrise ni les mots tappés, ni le nb de mots tappés !
  • # nombre d'occurences ?

    Posté par  . Évalué à 2.

    soit tu fais comme tu es parti, mais ca risque vite de devenir ingérable et lourd si t'as un surfeur qui fait comme ma soeur, taper 6 mots dans le formulaire de recherche ( :D ), soit tu comptes le nombre d'occurence des mots recherchés dans la description des enregistrements retrouvés, soit tu associes une note aux informations rapportées, et tu tries la dessus, auquel cas ton moteur s'améliorera avec le temps.

    maintenant, si tu y tiens, tu peux resortir ton cahier d'analyse combinatoire et de math, et y aller à coup de recherches méchantes, genre
    recherche pour 1, 2, 3, 4
    recherche pour 1, 2, 3
    recherche pour 1, 2, 4
    recherche pour 1, 3, 4
    recherche pour 2, 3, 4
    recherche pour 1, 2
    recherche pour 1, 3
    recherche pour 1, 4
    recherche pour 2, 3
    recherche pour 2, 4
    recherche pour 3, 4
    recherche pour 1
    recherche pour 2
    recherche pour 3
    recherche pour 4
    et bien sur, compléter entre chaque recherche la liste des enregistrement déja trouvés pour éviter les doublons (si un enregstrement contient 1 et 2, il sera plus que probablement repris dans la recherche sur 1 et 2, ainsi que dans la recherche 1, et la recherche 2...)

    toujours envie de faire ca comme ca ? ;)
    • [^] # Re: nombre d'occurences ?

      Posté par  . Évalué à 1.

      Ok, aurais tu la possibilité de m'expliquer ta méthode sur un petit exemple de code, car la je ne vois pas!
      Merci.
      • [^] # Re: nombre d'occurences ?

        Posté par  . Évalué à 2.

        pour compter le nombre d'occurences, tu fais simplement une requete du genre SELECT * FROM table WHERE (champ LIKE '%$val1%4) OR (champ LIKE '%$val2%') OR (champ LIKE '%$val3%') (moins les fautes) ensuite, pour chaque enregistrement, tu comptes les occurences de mot, et puis tu affiche les infos par ordre décroissant, par exemple ca :
        $tab = array();
        while ($data = mysql_fetch_assoc($result)) {
            $occurences = 0;
            pour toutes mes valeurs de recherche { // $val1, $val2, $val3...
                // compter le nombre d'occurence du mot recherché dans la description du truc
                // $occurence += nombre de fois que $val revient dans la description
            }
            $tab[$occurence] = $data[clé_primaire];
        }
        // ici, tu as un tableau qui contient le total d'occurence des mots recherchés en clé, et l'identifiant de l'enregistrement en valeur
        $i = count($tab);
        while ($i > 0) {
            if (isset($tab[$i])) {
                $requete = "SELECT * FROM table WHERE (clé_primaire = ".$tab[$i].")";
                $data = mysql_fetch_assoc(mysql_query($requete));
                // afficher les données, les premiere affichées étant celles ayant le plus d'occurences des mots recherchés
            } // else j'ai pas de tuple qui possède $i occurences des mots recherchés
        }
        
        l'inconvénient de cette méthode (outre le code assez pourri), c'est qu'il faut avoir des descriptions irréprochables pour avoir des résultats à peut pres corrects...
    • [^] # Re: nombre d'occurences ?

      Posté par  . Évalué à 1.

      Ok, aurais tu la possibilité de m'expliquer ta méthode sur un petit exemple de code, car la je ne vois pas!
      Merci.
      • [^] # Re: nombre d'occurences ?

        Posté par  . Évalué à 2.

        autre solution, le ranking par les surfeurs (les visiteurs notent la bonne corrélation entre leur requete et tes résultats) solution pas trop compliquée (quoique) à mettre en oeuvre : crée une autre table, qui contiendra : ID | pk_table | critère | note ID est l'identifiant probablement auto incrémenté de la table, mais ca on s 'en fou pk_table est l'identifiant du tuple concerné dans la table des voyages dans ton cas critère est ce sur quoi la recherche à porté note est le nombre de fois qu'on a voté pour le tuple pk_table, avec le mot critère comme critère (ou bout de) de recherche. à partir de la, tu recois plusieurs mots : $val1, $val2, $val3.
        $requete = "SELECT * FROM table_ranking WHERE (critère = $val1) or (critère = $val2) or (critère = $val3) ORDER BY ranking
        $result = mysql_query($requete);
        if (mysql_num_row($result) == 0) {
            // faire appel à une autre méthode de recherche
           return;
        }
        // else on a trouvé quelque chose
        $présent = array();
        while ($data = mysql_fetch_assoc($result)) {
            $ID = $data["pk_table"];
            if (!présent[$ID] == 0) { // si le résultat a pas déja été cité
                $requete = "SELECT * FROM voyages WHERE (ID = $ID);
                $data = mysql_fetch_assoc(mysql_query($requete));
                // afficher les données
            }
            $présent[$ID] = 1;
        }
        
        inconvénient ce cette méthode : peut ne produite aucun résultat, surtout au début. vérifier que les utilisateurs votent pas n'importe comment probablement assez peu optimisé avantage : après pas mal d'utilisations, très grosse probabilité d'avoir la réponse au dessus
  • # sans doute pas optimisé

    Posté par  . Évalué à 2.

    select
      "url",
      "titre"
    from
      "table"
    where
      locate('php',champs) > 0 or locate('mysql',champs) > 0 or locate('pertinance',champs) > 0
    order by
      if(locate('php',champs) > 0, 1, 0) + if(locate('mysql',champs) > 0, 1, 0) + if(locate('pertinance',champs) > 0, 1, 0) desc ;


    ça n'est pas testé.

    un inconvéniant c'est que si un mot apparait plusieurs fois il n'est compté qu'une fois ...


    Dam
  • # indexeur avec une base d'indexation

    Posté par  (site web personnel) . Évalué à 3.

    C'est le principe des moteurs de recherche

    La base d'intégration ressemble à :
    Mot : numéros de livre
    bonjour : 1,3,7
    bien : 2,7
    va : 1,8

    Donc il te faut un indexeur que tu fasse tourner régulièrement et un moteur qui en fonction des mots données extrait de la base d'indexation les documents qui contiennent d'abord tous N les mots, N-1 etc...
  • # fonction MATCH ... AGAINST

    Posté par  . Évalué à 3.

    C'est une fonctionnalité qui est présente nativement sur la plupart des (bonnes) bases de données récentes.
    Pour Mysql, c'est MATCH ... AGAINST (pas testé)

    Pour l'utilisation, voir la doc :
    http://www.nexen.net/docs/mysql/annotee/fulltext-search.php(...)

    Exemple de requête :

    mysql> SELECT id, body, MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root') AS score
    -> FROM articles WHERE MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root');
    +----+-------------------------------------+-----------------+
    | id | body | score |
    +----+-------------------------------------+-----------------+
    | 4 | 1. Never run mysqld as root. 2. ... | 1.5055546709332 |
    | 6 | When configured properly, MySQL ... | 1.31140957288 |
    +----+-------------------------------------+-----------------+
    2 rows in set (0.00 sec)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.