mise en place d'un module de recherche sur mon site

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics

djkori
Nouveau WRInaute
 
Messages: 42
Inscription: Mar Fév 22, 2005 22:04

mise en place d'un module de recherche sur mon site

Message le Jeu Oct 19, 2006 1:02

Bonjour, je suis en train (en tout cas, j'essaie...:D ) de mettre en place un module de recherche sur mon site... Pour cela je suis attentivement la doc mysql, qui est relativement claire, mais je rencontre des problèmes.
J'ai créé un table pour développer mon code, exactement la même que sur la doc... et j'ai fais un code simple pour tester.
Voici mon code:
Code: Tout sélectionner
<?php
   if(!empty($_POST['source']))
   {
$recherche=$_POST['source'];
echo'<h1>Recherche en cours</h1>';
echo'<form action="moteur.php" method="post" />
<input type="text" name="source">
<input type="submit" value="Chercher">
</form>';

$requete = (" SELECT *, MATCH(title,body) AGAINST('$recherche' WITH QUERY EXPANSION) AS score
                FROM articles
            WHERE MATCH(title,body) AGAINST('$recherche' WITH QUERY EXPANSION) ORDER BY score DESC ");
        $resultat=mysql_query($requete,$connect) || die (mysql_error());
echo'<table>
<tr><td>SCORE</td><td>TITLE</td><td>ID</td></tr>';

        while($donnees = mysql_fetch_array($resultat))
      {
            echo '<tr><td>'.$donnees['body'].'</td>
            <td>'.$donnees['title'].'</td>
            <td>'.$donnees['id'].'</td></tr>';
        }
        echo '</table>';
    }
   else
   {
    echo'<h1>Pas de recherche en cours</h1>';
   echo'<form action="moteur.php" method="post" >
<input type="text" name="source">
<input type="submit" value="Chercher">
</form>';
    }


Voici le message que j'ai:

Can't find FULLTEXT index matching the column list


Et cependant, les colonnes intéressées (title et body) ont bien les FULLTEXT index comme il est spécifié dans la doc mysql...

J'avoue que je ne comprends pas trop :cry:


biddybulle
WRInaute accro
WRInaute accro
 
Messages: 1469
Inscription: Lun Mai 30, 2005 21:55

Message le Jeu Oct 19, 2006 7:54

Mysql error doit avoir raison

$requete = ("SELECT * FROM articles
WHERE MATCH(title,body) AGAINST('$recherche' WITH QUERY EXPANSION));

ca donne quoi avec cette requete


blman
WRInaute accro
WRInaute accro
 
Messages: 2915
Inscription: Ven Sep 05, 2003 10:46

Message le Jeu Oct 19, 2006 9:19

Je dit peut-être une bétise, mais je crois me souvenir que si tu a placé tes FULLTEXT avec PhPMYAdmin, ça ne fonctionne pas. Il ne faut pas les faire un par un mais bel et bien les 2 en même temps avec la requête SQL qui convient :

ALTER TABLE ta_table ADD FULLTEXT ( Champ1 , Champ2, ...)

Essaie et dis moi si ça fonctionne...

djkori
Nouveau WRInaute
 
Messages: 42
Inscription: Mar Fév 22, 2005 22:04

cette partie du problème est résolue...

Message le Jeu Oct 19, 2006 14:17

Oui, en effet c'était ça, j'ai fais le type de requête avec les deux champs ensemble et le message n'apparaît plus

Voici ce que j'ai obtenu avec la requête mélant les deux champs:

Image

Seulement, maintenant je n'arrive pas à lister de résultat, ni même à savoir si il y a des résultats...
Compliqué tout ça...


blman
WRInaute accro
WRInaute accro
 
Messages: 2915
Inscription: Ven Sep 05, 2003 10:46

Message le Jeu Oct 19, 2006 14:22

Nombre de résultats :

SELECT COUNT(*) FROM ta_table WHERE MATCH (title, body) AGAINST ('".$SearchText."');

Lister les résultats par pertinence :

SELECT champ1, champ2, champ3, MATCH (title, body) AGAINST ('".$SearchText."') AS score FROM ta_table WHERE MATCH (title,body) AGAINST ('".$SearchText."') LIMIT ".$offset.",".$row_count.";

Essaye un truc comme ça.

djkori
Nouveau WRInaute
 
Messages: 42
Inscription: Mar Fév 22, 2005 22:04

voilivoilou

Message le Jeu Oct 19, 2006 17:29

Voila, ben en fait, FULLTEXT marche uniquement pour de longs paragraphes de texte, pas pour des titres, donc ça ne marchait pas parce ce que je visais aussi le titre pour le recherche et donc c'était pas bon...
En visant uniquement le contenu ça marche impec... sauf en ce qui concerne le comptage, il me met qu'il trouve 2 résultats alors que y en a 4 par exemple... je sais pas encore d'où ça vient...

Donc je vais adapter le script pour mon forum maintenant, pour voir, et ensuite, le problème va être le suivant: comment faire pour n'afficher qu'une partie du texte et non tout le paragraphe, avec le mot pertinent mis en valeur... comm sur google par exemple...
Y a t-il une solution simple?
Merci


blman
WRInaute accro
WRInaute accro
 
Messages: 2915
Inscription: Ven Sep 05, 2003 10:46

Message le Jeu Oct 19, 2006 17:33

FULLTEXT marche aussi pour les titres. Le seul truc, c'est que par défaut, il ne cherche pas dans les mots de moins de 3 caractères. Tu dois avoir tes problèmes dans tes requêtes, toi...

Sinon : http://fr3.php.net/substr pour afficher une portion de texte

djkori
Nouveau WRInaute
 
Messages: 42
Inscription: Mar Fév 22, 2005 22:04

Problèmes de requêtes?

Message le Jeu Oct 19, 2006 17:46

blman a écrit:FULLTEXT marche aussi pour les titres. Le seul truc, c'est que par défaut, il ne cherche pas dans les mots de moins de 3 caractères. Tu dois avoir tes problèmes dans tes requêtes, toi...

Sinon : http://fr3.php.net/substr pour afficher une portion de texte


Problèmes dans mes requêtes? Oui, sans doute... je commence à peine à optimiser mes requêtes... Voici le script que je suis en train de développer...

Code: Tout sélectionner
<?php
   if(!empty($_POST['source']))
   {
$recherche=$_POST['source'];

$requete = (" SELECT COUNT(id_message) FROM messages AS nombre
               
            WHERE MATCH(message) AGAINST('$recherche') " ) OR die(mysql_error());
        $resultat=mysql_query($requete,$connect) OR die(mysql_error());
      $data=mysql_fetch_array($resultat);
      $nombre=$data[0];
      if($nombre==0)
      {
      echo'<p>Aucun résultat trouvé</p>';
      }
      if($nombre>>0)
      {
      if($nombre==1)
      {
      echo'<p>Nous avons trouvé 1 résultat</p>';
      }
      else
      {
      echo'<p>Nous avons trouvé '.$nombre.' résultats</p>';
      }
$requete = (" SELECT *, MATCH(message) AGAINST('$recherche') AS score
                FROM messages
            WHERE MATCH(message) AGAINST('$recherche') ORDER BY score DESC ") OR die(mysql_error());
        $resultat=mysql_query($requete,$connect) OR die(mysql_error());

        while($donnees = mysql_fetch_array($resultat))
      {
            $titre=Affiche($donnees['titre']);
         $message=Affiche($donnees['message']);
         echo '<p>Titre: '.$titre.'<br />
         Contenu: '.$message.'</p><hr />';
        }
    }
   echo'<h1>Recherche en cours</h1>';
echo'<form action="moteur.php" method="post" />
<input type="text" name="source">
<input type="submit" value="Chercher">
</form>';
   }
   else
   {
    echo'<h1>Pas de recherche en cours</h1>';
   echo'<form action="moteur.php" method="post" >
<input type="text" name="source">
<input type="submit" value="Chercher">
</form>';
    }
?>


Je vais regarder le lien que tu m'indiques, merci :D


blman
WRInaute accro
WRInaute accro
 
Messages: 2915
Inscription: Ven Sep 05, 2003 10:46

Message le Jeu Oct 19, 2006 17:59

SELECT COUNT(id_message) FROM messages AS nombre WHERE MATCH(message) AGAINST('$recherche')


Y'a déjà un problème là. Le "AS nombre", je vois pas trop bien ce qu'il fait là :

SELECT COUNT(*) FROM messages WHERE MATCH (title, message) AGAINST ('".$recherche."');

SELECT *, MATCH(message) AGAINST('$recherche') AS score FROM messages WHERE MATCH(message) AGAINST('$recherche') ORDER BY score DESC


Le ORDER BY score n'est pas utile (je crois pas).

SELECT *, MATCH(title, message) AGAINST("'.$recherche.'") AS score FROM messages WHERE MATCH(title, message) AGAINST("'.$recherche.'")

Utilisise aussi les LIMIT dans tes requêtes sinon, tu risque d'avoir de sérieux problèmes de ressources si il y a trop de résultats. Il faudrait limiter l'affichage à 30 résultats par page par exemple.

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Jeu Oct 19, 2006 18:14

est-ce que ce système est suffisant pour faire une recherche ou faut-il encore implémenter quelque chose autour ?

il classe les résultats automatiquement par pertinence je suppose ?


blman
WRInaute accro
WRInaute accro
 
Messages: 2915
Inscription: Ven Sep 05, 2003 10:46

Message le Ven Oct 20, 2006 1:18

thierry8 a écrit:est-ce que ce système est suffisant pour faire une recherche ou faut-il encore implémenter quelque chose autour ?

il classe les résultats automatiquement par pertinence je suppose ?


Bien sûr, la recherche MySQL classe les résultats par pertinence. Mais on est vraiment loin d'un "vrai" moteur de recherche. L'utilisation des index FULLTEXT reste néanmoins une solution convenable pour le plupart des sites qui ne sont pas trop exigents car elle donne des résultats "convenables", ne prend pas trop de ressources et est assez facile à implémenter.

Par contre, pour des moteurs de recherches plus poussés, elle est très loin d'être suffisante : par défaut, les mots de moins de 3 caractères ne sont pas pris en compte, elle ne gère pas le problème du singulier/pluriel, elle ne gère pas les fautes d'orthographe, elle ne gère pas les synonymes, ...

Encore une fois, tout dépend du niveau de performance que l'on veut atteindre. Un bon moteur de recherche est un atout stratégique dans la réussite d'un site web. On estime d'ailleurs à 50%, la proportion des internautes qui utilisent les moteurs de recherche interne, c'est dire l'importance qu'on doit attribuer à cette fonctionnalité.

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Ven Oct 20, 2006 6:45

ok merci de toutes ces informations blman.

mieux vaut donc proposer au moins un système donc..
les deux encore mieux!

n'existe t-il pas des scripts "réputé", qui justement ont améliorer, autour de cette méthode mysql, la recherche (singulier/pluriels, etc..)


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Google Browser Sync

  • Logiciel de référencement AgentWebRanking
    AgentWebRanking est un logiciel professionnel qui permet d'analyser le positionnement d'un ou plusieurs sites dans plus de 300 moteurs de recherche dans le monde. Vous pouvez ainsi analyser les performances du référencement pour de nombreux mots-clés.
  • Transformer des citations en liens
    Cet outil vous permet de trouver des pages citant votre site mais ne faisant pas (encore) de lien. Il suffira parfois d'un simple mail pour transformer cette simple citation en lien (backlink).


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités