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

Nouveau WRInaute
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:
<?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:
 
WRInaute passionné
Mysql error doit avoir raison

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

ca donne quoi avec cette requete
 
WRInaute accro
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...
 
Nouveau WRInaute
cette partie du problème est résolue...

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:

sdz.jpg


Seulement, maintenant je n'arrive pas à lister de résultat, ni même à savoir si il y a des résultats...
Compliqué tout ça...
 
WRInaute accro
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.
 
Nouveau WRInaute
voilivoilou

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
 
WRInaute accro
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
 
Nouveau WRInaute
Problèmes de requêtes?

blman a dit:
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:
<?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
 
WRInaute accro
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.
 
WRInaute accro
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 ?
 
WRInaute accro
thierry8 a dit:
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é.
 
WRInaute accro
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..)
 
Discussions similaires
Haut