Salut à tous,

voilà si je me tourne vers vous c'est que j'ai encore un soucis bien entendu, mais cette fois avec ma requete SQL.
Je vous explique, j'ai une liste d'article dans ma base de donnée, title = Titre de l'article, et description = la description de l'article.
Sur le site il y a un Input du nom de "recherche", que je récupère, ensuite j'explose ce champ pour récupérer tous les mots clés, je fais un foreach, pour écrire ma requete si la recherche est en plusieurs mots.

voici le code qui écrit une partie de la requete :

if (isset($_POST'recherche']) && !empty($_POST'recherche'])){    
    $motclef = $_POST'recherche'];
    $mot = explode(" ",$motclef);
    print_r($mot);
    foreach ($mot as $k) {
        $mot_recherche .= ' AND title LIKE "%'.$k.'%" OR description LIKE "%'.$k.'%" ';
    }
}

Mon problème c'est que la recherche n'est pas vraiment pertinente ... J'entends par là que selon la position des mots clés le résultat n'est pas le même ...
Par exemple une recherche "Dans le bois", il va me sortir tous les articles contenant "Dans", "le" mais le troisième mot va passé à la trappe ...

Bref je tourne en rond depuis un moment et sa ce trouve la solution est toute simple une fonction que j'utilise pas ou autre ... Bref je sais pas si je me suis bien exprimé, mais en gros mon moteur de recherche me sors tout et n'importe quoi ....

il y a pas un truc à faire, genre limiter le nombre de caractères ou un truc du genre ? utiliser les expressions régulières ?

Une idée ? Comment vous faites vous ?

merci d'avance pour vos lumières

Neo

6 réponses


Bonjour,

Pour les problemes sql, il faut que tu pense comme si tu voulais le parler :

  • Je veux les articles dont les mots recherché sont "Dans le bois"

Pour faire un moteur de recherche pertinent, voici ce que je ferai :

  • une recherche sur "Dans le bois" en entier donc avant ton explode = Meilleure pertinence
  • une recherche sur bois car dans et le sont des mots à exclure via un regex = quel est le mot statégique de ta chaine = moins bonne pertinence mais correspond à ce que l'on recherche.

Cordialement

Neoboby
Auteur

Merci pour ton message,
quand je met la requete de l'user complète avant explode, la recherche n’aboutis plus ...
mes requetes ne marche pas si j'inverse les mots aussi ... :-s

Fait voir ton code ;) J'essayerai de t'aider

Neoboby
Auteur

Bah en fait mon code concernant la recherche est celui plus haut ... Après je rajoutes d'autres conditions mais qui n'y sont pas tout le temps ... dans la majorité des cas je finis avec une requete comme ca :

SELECT * FROM annonces WHERE active = 1 AND title LIKE "%dans%" OR description LIKE "%dans%" AND title LIKE "%bois%" OR description LIKE "%bois%" ORDER BY dateactive DESC LIMIT 0,10

merci pour ton soutient :-)

En faite je viens de tomber sur une methode que je ne connais pas mais qui à l'air très bien :
http://dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html

Donc dans ton cas, si on adapte avec les éléments que tu m'as donné, tu dois faire ça :

  • On modifie ta table pour ajouter le fulltext :

    ALTER TABLE annonces ADD FullText(title,description) ;

Puis, tu effectue une requête SELECT standard. Si on précise la commande MATCH ... AGAINST dans le WHERE alors la requête sera triée par pertinence, par défaut.

SELECT * FROM annonces WHERE MATCH(title,description) AGAINST('dans le bois') ;

En plus grâce à cette "fonction", tu peux recuperer le resultat de la pertinence en incluant dans le select.

SELECT *, MATCH(title,description) AGAINST('dans le bois') as pertinence FROM annonces WHERE MATCH(title,description) AGAINST('dans le bois') ;

A tester :)

Neoboby
Auteur

Je vais explorer cette partie à partir de demain et je ferais un retour voir si j'ai bien réussit à intégrer le concept ^^ !Merci encore !