Moteur de recherche en perl

Moteur de recherche en perl - Perl - Programmation

Marsh Posté le 23-01-2005 à 14:47:46    

Bonjour g conçue un petit moteur de recherche en perl.
Il fonctionne bien mais je voudrais lui a jouté une fonction de trie par pertinence et d'affichage sur plusireur page.
 
Mais seulement je ne sais pas comment faire (je sais qu'il faut des regxp mais on est faché)
 
Voici le code source :
 

Code :
  1. #!/usr/bin/perl
  2. $mailCmd = '/usr/sbin/sendmail';
  3. $fic="base.dat";
  4. $password="password"; 
  5. $page = "resultat.html";
  6. $maxresult=100;
  7. $maxcar=250;
  8. $rubrique = "rubrique.html";
  9. $message = "message.html";
  10. $myMail = "vodevil\@wanadoo.fr";
  11. $merci ="Merci d'avoir pris le temps de vous inscrire";
  12. $target= "_blank";
  13. $image='';
  14. ########################################################################
  15. $i=0;
  16. read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
  17. if ($ENV{'QUERY_STRING'})
  18. {$buffer = "$buffer\&$ENV{'QUERY_STRING'}";}
  19. @pairs = split(/&/,$buffer);
  20. foreach $pair (@pairs){
  21.       ($name,$value) = split(/=/,$pair);
  22.       $value =~ s/%(..)/pack("c",hex($1))/ge;
  23.       $value =~ s/\+/ /g;
  24. $VALUE{$name} = $value;
  25.       $Form{$name} .= "\0" if (defined($Form{$name}));
  26.       $Form{$name} .= "$value";
  27. }
  28. if (defined $Form{'recherche'}) { &recherche; exit; }
  29. if (defined $Form{'inscription'}) { &inscription; exit; }
  30. if (defined $Form{'suppression'}) { &supprimer; exit; }
  31. &rubrique;
  32. ########################################################################
  33. # Recherche par mot clés
  34. ##############
  35. sub recherche
  36. {
  37. open(INF, "$fic" ); @entries = <INF>; close(INF); $count = @entries;
  38. $mc = "$Form{'mc'}";
  39. if (!$mc) { &erreur ("ERREUR<BR><BR>Vous n'avez pas donné de mots clefs" ); }
  40. elsif (length $mc <2) { &erreur ("ERREUR<BR><BR>Votre recherche n'est pas valide" ); }
  41. elsif (length $mc <3) { &erreur ("ERREUR<BR><BR>Votre recherche n'est pas assez precise" ); }
  42. elsif (length $mc >30) { &erreur ("ERREUR<BR><BR>Vous avez tapé trop de mots clés" ); }
  43. $mc =~ s/^\s+//;
  44. $mc =~ s/\s+$//;
  45. @mc = split(/ /, $mc);
  46. open (fic, "$fic" ) || &erreur ("ERREUR<BR><BR>erreur de lecture du fichier $fic : $!" );
  47. foreach $ligne (<fic> )
  48. {
  49.   foreach $mc (@mc) { unless ($ligne =~ /$mc/i) {goto ap265; } }
  50.   $i++;
  51.   ($titre[$i],$url[$i],$descr[$i],$rub[$i],$mail[$i],$date[$i]) = split (/\|/, $ligne);
  52.   ap265:
  53. }
  54. if ($i >$maxresult) { $txt.= "Il y a trop de résultat à votre recherche. Veuillez la reformuler.</font></P>\n"; }
  55. else {
  56. foreach $i (1..$i) { $txt.= "<p>$image$i. <A Href=$url[$i] target=$target>$titre[$i]</A><br><BR><font size=-1>$descr[$i]<br><I>Rubrique : $rub[$i] [$date[$i]]</I></font></P>\n"; }
  57.      }               
  58. if (!$txt) { $txt.= "<center>Il n'y a pas de résultat à votre recherche</center>\n"; }
  59. $ouvrir=$page;
  60. &template;
  61. exit;
  62. }
  63. ########################################################################
  64. # Recherche par rubrique
  65. ##############
  66. sub rubrique
  67. {
  68. @mc = $Form{'rubrique'};
  69. if (!$Form{'rubrique'}) { &erreur ("ERREUR<BR><BR>Votre demande est invalide" ); }
  70. open (fic, "$fic" ) || &erreur ("ERREUR<BR><BR>erreur de lecture du fichier $fic : $!" );
  71. foreach $ligne (<fic> )
  72. {
  73. foreach $mc (@mc)
  74.    {
  75.     ($titre,$url,$descr,$rub,$mail,$date) = split (/\|/, $ligne);
  76.     unless ("$rub" =~ /$mc/i) {goto ap265; }
  77.    }
  78.   $i++;
  79.   ($titre[$i],$url[$i],$descr[$i],$rub[$i],$mail[$i],$date[$i]) = split (/\|/, $ligne);
  80.   ap265:
  81. }
  82. foreach $i (1..$i) { $txt.= "<p>$image$i. <A Href=$url[$i] target=$target>$titre[$i]</A><br><BR><font size=-1>$descr[$i]<br><I>$url[$i] [$date[$i]]</I></font></P>\n"; }
  83. if (!$txt) { $txt.= "<center>Il n'y a pas de lien dans cette rubrique.</center>\n"; }
  84. $ouvrir=$rubrique;
  85. &template;
  86. exit;
  87. }


 
 
 
Si quelqu'un sait comment faire ======> vodevil@hotmail.fr
 
Merci!    :fou:  :o  :bounce:

Reply

Marsh Posté le 23-01-2005 à 14:47:46   

Reply

Marsh Posté le 25-01-2005 à 10:47:14    

shinux a écrit :

Si quelqu'un sait comment faire ======> vodevil@hotmail.fr


on est sur un forum ici...
 
Ton code est assez "crade": pas de "use strict", des goto partout, des appels de fonctions avec des &.... on dirait du perl 4!
 
Sinon a par ca ta recherce n'est pas tres efficace: si j'ai bien dechiffré tu parcours le fichier à la recherche des mots de la requetes, ca n'est pas tres "scalable" et risque rapidement de devenir super lent (surtout sur un serveur mutualisé).
Ce qu'il faut faire c'est indexer tes document, puis rechercher dans l'index au moment des requetes (et evidement réindexer tes document des qu'il changent). tu peux voir l'index comme une sorte de table de hash qui pour chaque mots pointera les documents qui le contiennent.
Regarde plutot du coté de vrais moteur d'indexation comme Swish (http://swish-e.org/) qui a une interface tres bien faite en perl: SWISH::API (http://swish-e.org/current/docs/API.html) (attention cette API la n'est pas sur CPAN, sur CPAN on ne trouve qu'une ancienne version peu efficace). Tu trouvera ensuite sur CPAN plein de modules pour présenter les resultats (context highlighting, templates, etc...).
Tu peux aussi regarder du coté de Plucene (lucene en Perl) ou Xapian.
 
bonne continuation
 

Reply

Sujets relatifs:

Leave a Replay

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