[Resolu]Moteur de recherche basique

Moteur de recherche basique [Resolu] - PHP - Programmation

Marsh Posté le 23-07-2005 à 10:42:42    

Bonzour,
 
je cherche depuis pas mal de temps un peu partout sur le net comment faire un "moteur de recherche" basique en PHP. Et je trouve rien d'intéressant pour moi.
Ce que je veux faire c'est rechercher dans une DB par MotClé uniquement en AND.
 
Par exemple la requete est "jeux videos", je veux qu'il affiche d'abord les resultats avec "jeux videos" puis les resultats avec "jeux" et "videos" pas forcément cote a cote  
Jusqu'a present ce que je fais c'est

Code :
  1. mysql_query("SELECT * FROM Table WHERE Description LIKE '%".$MotCles."%'" );


 
Donc ca ca me sort les "jeux videos".
Maintenant pour les "jeux" et "video" pas cote a cote je vois pas d'idée facile et j'ai pas trouvé de fonction qui le ferait d'office.
Ca doit etre archi classique puisque beaucoup de moteur de recherche de forum sont comme ca, mais leur codes sources sont un peu trop compliqué encore pour moi.
merci


Message édité par kray le 25-07-2005 à 11:28:59
Reply

Marsh Posté le 23-07-2005 à 10:42:42   

Reply

Marsh Posté le 23-07-2005 à 11:06:38    

Et si tu essayait d'analyser ton champ de recherche avant de l'injecter dans ta requete sql ??
 
ensuite, si tu fait un strcmp( ) entre ta description et tes mots clefs, tu aura un debut de pertinence des requete...
 
Après, il faut encore supprimer les mots de moins de 3 lettres dans ta desc pour ameliorer la pertinence... etc...
 
Enfin, ce ne sont que des idées comme ca

Reply

Marsh Posté le 23-07-2005 à 11:49:48    

Et passer tes champs en fulltext pour eliminer le besoin de faire un LIKE %$qqch% qui est catastrophique du point de vue resources


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 23-07-2005 à 12:19:12    

Citation :

Et si tu essayait d'analyser ton champ de recherche avant de l'injecter dans ta requete sql ??


 
C'est a dire? Car dans mon post précédent j'ai mis l'idée mais sinon je verifie si les magic quote sont activée ou pas et je fais en fonction de ca un mysql_real_escape_string.
Le problème c'est que pour faire le strcmp() va falloir que j'extraie chaque description de la DB,non ? Et si c'est le cas j'ai peur qu'au niveau res ca suive pas. Mais je vais essayer de mieux comprednre ton idée car c'est vrai que je vais etre obligé d'extraire de la DB et d'ensuite analyser à un moment ou un autre.
 

Citation :

Et passer tes champs en fulltext pour eliminer le besoin de faire un LIKE %$qqch% qui est catastrophique du point de vue resources


 
C'est quoi du fulltext?(shame on me).

Reply

Marsh Posté le 23-07-2005 à 12:31:00    

quand je disait analyser, je voulait dire recuperer, le champ, le passer à la moulinette pour le separer en mots... chercher des chaines AND etc... pour ensuite faire une requete bien adaptée à ta recherche...

Reply

Marsh Posté le 23-07-2005 à 13:01:58    

kray a écrit :


Citation :

Et passer tes champs en fulltext pour eliminer le besoin de faire un LIKE %$qqch% qui est catastrophique du point de vue resources


 
C'est quoi du fulltext?(shame on me).


 
 
va voir sur le site de mysql, leur réponse sera bien plus complete que la mienne :D


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 23-07-2005 à 16:58:38    

Ok merci je suis en train de voir ca. Ca a l'air de correspondre a ce que je cherche, meme si c'est un peu obscur leur documentation online.[EDIT]D'ailleur si quelqu'un connait un bon tutoriel sur la full text search :whistle: [/edit]
Si vous avez d'autres idées proposez quand meme! ;-)


Message édité par kray le 23-07-2005 à 17:15:54
Reply

Marsh Posté le 24-07-2005 à 14:06:58    

En fait je viens de trouver un très bon tutorialsue la recherche full text.  
Seulement il y a deux chosed que je n'arrive pas a faire avec ces requetes mySQL: -je n'arrive pas à intégrer COUNT(plus rapide que mysql_num_rows il me semble)
-je n'arrive à utiliser LIMIT.  
 
[EDIT]
Par exemple

Code :
  1. $requete= mysql_query("SELECT COUNT(*) Titre, Description,
  2.                MATCH(Titre, Description)
  3.                AGAINST ('$searchstring') AS score FROM ListObj
  4.                WHERE MATCH(Titre, Description)
  5.                AGAINST ('$searchstring') ORDER BY score DESC" ) or die(mysql_error());


ne marche pas (sans le COUNT(*) ca marche)
 
[/EDIT]
 
Car ce que je voudrais faire c'est afficher les resultats de la recherche 10 par 10 avec des liens vers les resultats suivants.
Donc est-ce quand mem possible d'utiliser COUNT et LIMIT ou dois je faire mysql_num_rows et ruser(ce qui lire toutes la table pour chaque requete au lieude  lire dix elements a chaque fois)


Message édité par kray le 24-07-2005 à 17:42:56
Reply

Marsh Posté le 24-07-2005 à 23:36:12    

Si tu enleve Titre, Description, ca marchera mieux... pour le count...

Reply

Marsh Posté le 25-07-2005 à 10:50:16    

Oui c'est vrai que ca devrait etre mieux, mais maintenant ca me fait une autre erreur:
 
[cpp]
$requete= mysql_query("SELECT COUNT(*)  
               WHERE MATCH(Titre, Description)
               AGAINST ('$searchstring')" ) or die(mysql_error());
[/ccp]
 
L'erreur est : Erreur de syntaxe près de 'WHERE MATCH(Titre, Description) AGAINST ('bonjour'' à la ligne 2
 
Donc il y a toujours un truc qui cloche :pt1cable:


Message édité par kray le 25-07-2005 à 10:50:59
Reply

Marsh Posté le 25-07-2005 à 10:50:16   

Reply

Marsh Posté le 25-07-2005 à 11:02:45    

Avec un FROM c'est mieux nan ?


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 25-07-2005 à 11:12:45    

pour analyser ton champ recherche, vu que y'a que des AND, on peut supposer que l'espace est le délimiteur symbolisant le AND dans ton champ recherche. La fct php $Array = explode(" ", $Champ_Recherche) me parait bien : ça transforme ta chaîne en un tableau de mots... Après, tu construit ta requête SQL à partir de ce tableau.

Reply

Marsh Posté le 25-07-2005 à 11:23:51    

Code :
  1. $requete= mysql_query("SELECT COUNT(*) AS nombre FROM ListObj
  2.                WHERE MATCH(Titre, Description)
  3.                AGAINST ('$searchstring')" ) or die(mysql_error());
  4. $resultat= mysql_fetch_array($requete);
  5. echo $resultat['nombre'];


 
Effectivement ca  marche mieux avec un FROM  :lol:  
 
(shame on me again)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed