Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
645 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Mon moteur de recherche par en sucette

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Mon moteur de recherche par en sucette

n°1123777
snarky
Posté le 18-06-2005 à 02:59:22  profilanswer
 

: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
mood
Publicité
Posté le 18-06-2005 à 02:59:22  profilanswer
 

n°1123946
sonikbuzz
echo &#034;Hello World!&#034;;
Posté le 18-06-2005 à 13:55:16  profilanswer
 

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 -
n°1123959
snarky
Posté le 18-06-2005 à 14:18:49  profilanswer
 

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

n°1124225
snarky
Posté le 18-06-2005 à 21:50:10  profilanswer
 

quelqu'un ?

n°1124672
snarky
Posté le 19-06-2005 à 17:53:08  profilanswer
 

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é.

n°1124733
Djebel1
Nul professionnel
Posté le 19-06-2005 à 20:47:25  profilanswer
 

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

n°1124745
snarky
Posté le 19-06-2005 à 21:13:05  profilanswer
 

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]'";

n°1124927
Djebel1
Nul professionnel
Posté le 20-06-2005 à 02:30:40  profilanswer
 

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

n°1125174
snarky
Posté le 20-06-2005 à 13:33:27  profilanswer
 

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".

n°1125275
snarky
Posté le 20-06-2005 à 15:24:13  profilanswer
 

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:

mood
Publicité
Posté le 20-06-2005 à 15:24:13  profilanswer
 

n°1126225
snarky
Posté le 21-06-2005 à 13:17:53  profilanswer
 

yop

n°1126273
soju
One shot !
Posté le 21-06-2005 à 14:00:17  profilanswer
 


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

n°1126282
snarky
Posté le 21-06-2005 à 14:06:58  profilanswer
 

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

n°1126506
sonikbuzz
echo &#034;Hello World!&#034;;
Posté le 21-06-2005 à 16:53:17  profilanswer
 

: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 -
n°1129055
snarky
Posté le 23-06-2005 à 18:02:17  profilanswer
 

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. ?>

n°1130551
snarky
Posté le 25-06-2005 à 01:42:28  profilanswer
 

up! :D

n°1131131
snarky
Posté le 26-06-2005 à 08:47:53  profilanswer
 

:'(

n°1131134
pascal_
Posté le 26-06-2005 à 09:25:47  profilanswer
 

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:

n°1131385
snarky
Posté le 26-06-2005 à 18:08:26  profilanswer
 

c galere sa :S


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Mon moteur de recherche par en sucette

 

Sujets relatifs
Recherche logiciel open source mailing listrecherche d'un hébergeur
Recherche topic super pratique :)[Apprenti Programmeur] Je Recherche UnTutorial Pour Visual C++ 2005
recherche tutorialMoteur de recherche Google dans MSN toolbar ?
[Visual C++] Recherche un équivalent de popenprobleme moteur de recherche php
Plus de sujets relatifs à : Mon moteur de recherche par en sucette


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR