Mon moteur de recherche par en sucette

Mon moteur de recherche par en sucette - PHP - Programmation

Marsh Posté le 18-06-2005 à 02:59:22    

:hello: la compagnie.
 
Je me retrouve face a un petit dilemme et je n'arrive pas a trouver d'où peut bien venir le problème. J'ai codé un petit moteur de recherche(il marchai correctement) puis j'ai cherché a l'améliorer de maniere a ce qu'il puisse prendre :
Une expression -> "expression"
Un mot commencant par DebutDuMot -> DebutDuMot*
Un mot finissant par FinDuMot ->*FinDuMot
Plusieurs mot -> Mot1 Mot2
 
Après récuperation de mon champ ($search) issu de mon formulaire, j'effectue une série de test pour définir le type de recherche souhaité (cf ci-dessus). Jusque là tout marche. Mais une fois que je lui demande de m'afficher les résultats piouf! il se met a m'affichais n'importe quoi ou du moins un résultat completement faux.
 
si quelqu'un pouvait eclairer ma lanterne, cela me permettrais de corriger mon erreur  :sarcastic:
 
le site est donc http://snarky.free.fr
Il suffit d'effectué une recherche sur l'un des mots présents dans les news (titre, article, auteur)
 
et voici mon code.

Code :
  1. <?php
  2. if($search)
  3. {
  4. include('./sql.php');
  5. $search = trim($search); // on retire les espaces
  6. $expression = explode(addslashes('"'), $search);
  7. echo '<p><b>Premier test :</b><br /> $expression[0] :', $expression[0] ,'<br />$expression[1] :', $expression[1] ,'<br />$search :', $search , '</p>';
  8. if($expression[0] === '') //test expression
  9.  {
  10.  $go = "SELECT title_article, text_article, author_article, date_article FROM Articles WHERE title_article OR text_article OR author_article LIKE '$expression[1]'";
  11.  echo '<p><b>Premiere test reussi: on recherche une expression.</b><br />$go = ', $go ,'<br />', $test ,'</p>';
  12.  }
  13. else
  14.  {
  15.  $expression = explode(chr(42), $expression[0]);
  16.  echo '<p><b>Deuxieme test :</b><br /> $expression[0] :', $expression[0] ,'<br /> $expression[1] :', $expression[1] ,'<br />$search :', $search , '</p>';
  17.  if($expression[0] === '') //test *mot
  18.   {
  19.   $go = "SELECT title_article, text_article, author_article, date_article FROM Articles WHERE title_article OR text_article OR author_article LIKE '%$expression[1]'";
  20.   echo '<p>Deuxieme test reussi : on recherche *mot.<br />$go = ', $go ,'/<p>';
  21.   }
  22.  else
  23.   {
  24.   $expression = explode(chr(42), $expression[0]);
  25.   echo '<p><b>Troisieme test :</b><br /> $expression[0] :', $expression[0] ,'<br /> $expression[1] :', $expression[1] ,'<br />$search :', $search , '<p/>';
  26.   if($expression[1] === '') //test mot*
  27.    {
  28.    $go = "SELECT title_article, text_article, author_article, date_article FROM Articles WHERE title_article OR text_article OR author_article LIKE '$expression[0]%'";
  29.    echo '<p>Troisieme test reussi : on recherche mot*.<br />$go = ', $go ,'</p>';
  30.    }
  31.   else
  32.    {
  33.    $expression = explode(' ' , $expression[0]); // on sépare les mots dans un tableau pour faire une recherche sur chaque mot
  34.    $count_words = count($expression); // on compte le nombre de mots que comporte le tableau(expression)
  35.    for($i = 0; $i < $count_words; $i++) // on effectue une recherche pour chaque mot en partant du [0] jusqu'a [$count_words]
  36.     {
  37.     $go = "SELECT title_article, text_article, author_article, date_article FROM Articles WHERE title_article OR text_article OR author_article LIKE '$expression[$i]'";
  38.     }
  39.    echo '<p><b>On effectue une recherche sur plusieurs mots.</b><br />$go = ', $go ,'</p>';
  40.    }
  41.   }
  42.  }
  43. echo '<p><b>Type de recherche validé : </b><br />$go = ', $go ,'<br />$search :', $search , '</p>';
  44. $requete = mysql_query($go) or die(echec);
  45. $num_requete = mysql_num_rows($requete); // on cherche a connaitre le nombre de resultats
  46. if($requete)
  47.  {
  48.  if($num_requete === 0)
  49.   {
  50.   echo'Aucuns resultats.';
  51.   }
  52.  else
  53.   {
  54.   echo '
  55.    <p><b>R&eacute;sultat de votre recherche a propos de : <span class="italic">', $search ,'</spans><br />
  56.    Il y a ', $num_requete ,' r&eacute;sultat(s).</b> </p>';
  57.   while($result = mysql_fetch_array($requete))
  58.    {
  59.    echo 'Actu | ', $result['date_article'] ,' | <span class="bold">', $result['title_article'] ,'</span> <br />'; // on affiche les resultats
  60.    }
  61.   }
  62.  }
  63. else
  64.  {
  65.  echo'bla';
  66.  }
  67. }
  68. else
  69. {
  70. echo 'pas de mot clés';
  71. }
  72. ?>


 
Si vous trouvez qu'il n'y a pas assez de commentaires, je peux éditer et commenter chaqu'unes des lignes :jap:


Message édité par snarky le 18-06-2005 à 03:00:43
Reply

Marsh Posté le 18-06-2005 à 02:59:22   

Reply

Marsh Posté le 18-06-2005 à 13:55:16    

Salut,
Tu connais MATCH et AGAINST avec des index en FULL TEXT
 
Je pense que ce serait plus simple et rapide avec  ;)


---------------
- Annuaire  PHOTOGRAPHIE sur Tagbox.fr -
Reply

Marsh Posté le 18-06-2005 à 14:18:49    

non connais pas :p
je debute en faite donc j'utilise ce qui est a ma portée tout en essayant d'en apprendre d'avantage :jap:
 
m'enfin pour le moment ya un probleme avec ma boucle qui ve pas bouclé , et qui affiche un resultat invalide

Reply

Marsh Posté le 18-06-2005 à 21:50:10    

quelqu'un ?

Reply

Marsh Posté le 19-06-2005 à 17:53:08    

Personne n'aurait une idée sur le pourquoi du comment ?
Je ne comprend pas pkoi il affiche 1resultat alors que celui si n'a rien avoir avec le mot recherché.

Reply

Marsh Posté le 19-06-2005 à 20:47:25    

c'est pour lesquels de tes 4 types de recherche que ca donne des résultats bizarres? les 4? un seul?

Reply

Marsh Posté le 19-06-2005 à 21:13:05    

pour tous
 
sa maffiche qu'un seul resultat a savoir la derniere entrée de ma table (news sur battlefied).
 
visiblement ça serait un soucis au nivo de la requete
 
"SELECT title_article, text_article, author_article,  
date_article FROM Articles WHERE title_article OR text_article OR author_article LIKE '%$expression[1]'";

Reply

Marsh Posté le 20-06-2005 à 02:30:40    

elle a l'air bien cette requete pourtant.
Une idée très très bête, mais peut-être mettre

Code :
  1. WHERE title_article LIKE '%$expression[1]'" OR text_article LIKE '%$expression[1]'" OR author_article LIKE '%$expression[1]'";


pas taper, je sais que c'est assez ridicule comme idée :D

Reply

Marsh Posté le 20-06-2005 à 13:33:27    

vien de faire quelques tests, et voila ce que j'obtient
 

Code :
  1. "SELECT title_article, text_article, author_article, 
  2. date_article FROM Articles WHERE title_article OR text_article OR author_article LIKE '%$expression[1]'";


 
me renvoi la derniere entrée de ma table a savoir battlefied
alors que  
 
 

Code :
  1. "SELECT title_article, text_article, author_article, 
  2. date_article FROM Articles WHERE title_article LIKE '%$expression[1]'";


 
me renvoi "aucun resultat".

Reply

Marsh Posté le 20-06-2005 à 15:24:13    

Djebel1 a écrit :

elle a l'air bien cette requete pourtant.
Une idée très très bête, mais peut-être mettre

Code :
  1. WHERE title_article LIKE '%$expression[1]'" OR text_article LIKE '%$expression[1]'" OR author_article LIKE '%$expression[1]'";


pas taper, je sais que c'est assez ridicule comme idée :D


 
ça revient au même que mon message ci-dessus :jap:

Reply

Marsh Posté le 20-06-2005 à 15:24:13   

Reply

Marsh Posté le 21-06-2005 à 13:17:53    

yop

Reply

Marsh Posté le 21-06-2005 à 14:00:17    


1. pbs dans ta requete : tu dois mettre le like pour CHAQUE champs que tu veux tester
2. pour eviter les pb de reconnaissance de variable dans une chaine :
  - '%$expression[1]' => '%{$expression[1]}'
  - mais le mieux est d'utiliser des ' et de sortir les variables

Reply

Marsh Posté le 21-06-2005 à 14:06:58    

oki oki merci pour tes infos
je vais tester ça :jap:

Reply

Marsh Posté le 21-06-2005 à 16:53:17    

:hello:  
 
Bon je vais encore me repeter (c'est la vieillesse  :D ) mais pourquoi ne pas utiliser des fonction déjà toutes faites par les dev de MSQL . c'est plus RAPIDE et FACILE.
 
voila un exemple:
 

Citation :

$query = "SELECT num_produit, url, titre, description, MATCH(titre, description, url) AGAINST('$expression_recherche') AS score    
                        FROM $table_produit, $table_categorie  
                        WHERE MATCH(titre, description, url) AGAINST('$id_cat')";


 
Les fields titre, description, url, doivent avoir un index FULL TEXT :

Citation :

FULLTEXT KEY `fulltext_index` (`titre`,`description`,`url`)


 
Ca marche trés bien et tous tes problèmes sont réglés, bien sur les resultats sont classé par ordre de pertinence


Message édité par sonikbuzz le 21-06-2005 à 16:54:54

---------------
- Annuaire  PHOTOGRAPHIE sur Tagbox.fr -
Reply

Marsh Posté le 23-06-2005 à 18:02:17    

J'ai fais la modif que tu m'as conseillé et ça marche de temps en temps :sarcastic:
quand je fais une recherche sur un mot ou deux ça marche, mais desfois non  :pfff:  
exemple : Une recherche sur admin renverra les news postées par admin, alors qu'une recherche sur snarky renvoi "aucuns resultats".
 

Code :
  1. <?php
  2. if($search)
  3. {
  4. include('./sql.php');
  5. $search = trim(strtolower($search)); // on met en miniscules et on retire les espaces
  6. $go = "SELECT id_article, title_article, text_article, author_article, MATCH(title_article,text_article,author_article) AGAINST('$search') AS score FROM Articles WHERE MATCH(title_article,text_article,author_article) AGAINST('$search')";
  7. $requete = mysql_query($go) or die(echec);
  8. $mysql_num_rows = mysql_num_rows($requete);
  9. if($requete)
  10.  {
  11.  if($mysql_num_rows === 0)
  12.   {
  13.   echo'Aucuns resultats.';
  14.   }
  15.  else
  16.   {
  17.   echo 'Il y a ', $mysql_num_rows,'.';
  18.   while($result = mysql_fetch_array($requete))
  19.    {
  20.    echo 'Actu | ', $result['date_article'] ,' | <span class="bold">', $result['title_article'] ,'</span> <br />'; // on affiche les resultats
  21.    }
  22.   }
  23.  }
  24. else
  25.  {
  26.  mysql_free_result($requete);
  27.  }
  28. }
  29. else
  30. {
  31. echo'Aucuns resultats.';
  32. }
  33. ?>

Reply

Marsh Posté le 25-06-2005 à 01:42:28    

up! :D

Reply

Marsh Posté le 26-06-2005 à 08:47:53    

:'(

Reply

Marsh Posté le 26-06-2005 à 09:25:47    

snarky a écrit :

J'ai fais la modif que tu m'as conseillé et ça marche de temps en temps :sarcastic:
quand je fais une recherche sur un mot ou deux ça marche, mais desfois non  :pfff:  
exemple : Une recherche sur admin renverra les news postées par admin, alors qu'une recherche sur snarky renvoi "aucuns resultats".
 


 
T'es sûr que ça ne vient pas de ça :
 

Citation :

La recherche du mot "MySQL" ne donne aucun résultat dans l'exemple précédent, car il est présent dans plus de la moitié des lignes. Ainsi, il est considéré comme un mot à ignorer (un mot avec une valeur sémantique nulle). C'est le comportement le plus optimal : un langage de requêtes ne doit pas retourner chaque ligne d'une table de 1 Go.  
 
Un mot qui est trouvé dans la moitié des enregistrements d'une table n'est pas efficace pour trouver les document appropriés. En fait, il trouvera sûrement beaucoup de documents inappropriés à la recherche. On sait tous que cela arrive souvent lorsqu'on recherche quelque chose sur internet en utilisant un moteur de recherche. C'est en suivant ce raisonnement que ces lignes se sont vues attribuer une valeur sémantique très basse dans ce cas particulier .  
Le seuil de 50% a un impact significatif lorsque vous commencez à comprendre comment fonctionne l'index : si vous créez une table et insérez une ou deux lignes, chaque mot apparaîtra dans 50% des lignes. Résultat, la recherche ne trouvera rien. Assurez-vous d'insérer au moins trois lignes, et même plus.


 
http://www.nexen.net/docs/mysql/an [...] search.php
 
 
Sinon, je l'utilise et ça marche très bien  :jap:

Reply

Marsh Posté le 26-06-2005 à 18:08:26    

c galere sa :S

Reply

Sujets relatifs:

Leave a Replay

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