Présenter les résultats de recherche comme un “vrai” moteur

All contributions published for previous SPIP versions

Cette contrib permet de présenter les résultats de recherche en mixant les résultats venant des articles, des rubriques, des sites référencés etc.

Le moteur de recherche de SPIP souffre d’un gros défaut : il recherche successivement dans les différents type d’objet de la base de données : articles, rubriques, brèves, sites référencés etc.

C’est dommage de ne pas pouvoir présenter ces résultats mixés selon leur « pertinence ».

Pour parvenir à ce résultat je vous propose cette contribution qui intègre les contribs «Google Like» et «Score dans le moteur de recherche» de Japanim (celle-ci n’est plus en ligne).

Comment ça marche ?

C’est très simple...

On commence par réaliser chaque boucle de recherche mais au lieu d’afficher tout de suite les résultats on va stocker tous les éléments nécessaires dans un tableau PHP :
-  URL de la page
-  Titre de la page
-  Résumé à afficher (généré par Google Like)
-  Pertinence (le contenu de #POINTS)
-  Pertinence en format graphique

Cela donne pour un article :

<!-- Articles trouves -->
<BOUCLE_articles(ARTICLES) {recherche} {par points} {inverse} {0,9}>
   <?php
   // création de la chaîne à rechercher dans Google Like
   $string = '[(#TITRE|supprimer_numero|texte_script) ]';
   $string = '[(#SOUSTITRE|supprimer_numero|texte_script) ]';
   $string .= '[(#DESCRIPTIF|textebrut|texte_script) ]';
   $string .= '[(#TEXTE|textebrut|texte_script)]';
   // création du tableau PHP
   $tab_result["logo"][] = '[<a href="#URL_ARTICLE"><img src="IMG/(#LOGO_ARTICLE|fichier)" border="0" alt="#TITRE" title="#TITRE" hspace="5" vspace="5" align="left" width="50"></a>]';
   $tab_result["url"][] = '#URL_ARTICLE';
   $tab_result["titre"][] = '[(#TITRE|majuscules)] <BOUCLE_TITRE(RUBRIQUES){id_rubrique}>[<i>de</i> (#TITRE|majuscules)]</BOUCLE_TITRE>';
   $googlelike = google_like($string);
   if ($googlelike) {
      $tab_result["texte"][] = $googlelike;
   }
   else {
      $tab_result["texte"][] = '[(#CHAPO|texte_script)]';
   }
   // pondération normale des articles
   $points = #POINTS * 1;
   $tab_result["points"][] = $points ;
   $tab_result["star"][] = star($points);
   ?>
</BOUCLE_articles>

La pondération des points me sert parce que je trouve que les points de pertinence calculés par SPIP ne sont pas « justes » entre les types de donnés. J’ai donc choisi de sur-pondérer les rubriques au détriment des sites référencés.

Une fois qu’on a ce tableau PHP il suffit de le trier selon la pertinence et de l’afficher de la manière qu’on préfère :

<?
if ($tab_result["points"]) {
   // on trie le tableau selon le classement de correspondance
   arsort($tab_result["points"]);
   // Affichage des résultats triés
   foreach(array_keys($tab_result["points"]) as $key) {
      echo "<div>" . $tab_result["logo"][$key];
      echo "<h2>";
      echo "<a href=\"".$tab_result["url"][$key]."\">".$tab_result["titre"][$key]."</a> " . $tab_result["star"][$key]  ."</h2>\n";
      echo "<p><a href=\"".$tab_result["url"][$key]."\">".$tab_result["texte"][$key]."</a></p>\n";
      echo "<div class=\"spacer\"><img src=\"IMG/vide.gif\" alt=\"\" height=\"1\" width=\"0\"></div>";
      echo "</div>";
   }
}
else {
   echo "<p>Désolé nous n'avons rien trouvé qui corresponde à votre recherche sur le site !</p>";
}
?>

Cela nous affiche bien la liste des résultats triés par pertinence.

Vous pouvez voir un exemple en live sur mon site : www.livres-online.com/recherche.php3?recherche=potter

Dans le fichier ci-joint je n’ai pas mis la boucle sur les brèves mais elle est facile à ajouter en s’inspirant des autres.

Apparemment la version 1.8 permettra de faire une recherche sur les messages de forum, on pourra alors décliner le même principe.

Le temps de tri du tableau PHP sur une page qui n’est pas mise en cache peut générer une charge sur le serveur. Néanmoins la page de recherche n’est en général pas la page la plus appelée du site et le traitement semble suffisamment rapide pour que le gain en fonctionnalité le justifie.

updated on 8 December 2006

Discussion

4 discussions

  • 1

    Salut tous,

    J’ai essayé ce truc, et quoi que je tape dans le champs de recherche, il m’affiche “Désolé, nous n’avons rien trouvé....”

    J’ai bien mis les boucles dans ma page recherche.html de mon squelette. Par contre, je n’ai pas de dossier “Fonctions” à la racine de mon site, alors j’ai enregistré le fichier mes_fonctions.php3 directement à la racine.

    *... marche pas...

    Help...

    • il est fonctionnel ton site ? car sauf erreur de ma part il est present par defaut se fichier

    Reply to this message

  • 2

    Bonjour.

    Visiblement ca ne marche plus quand on passe à la dernière version de Spip (1.8.
    2). Quelqu’un connait-il la solution ?

    • J’ai réussi à le faire fonctionner pour une 1.8.2 en supprimant le filtre majuscules sur les titres...

      Par exemple :

      //$tab_result[“titre”][] = ’(#NOM_SITE’;

      $tab_result[“titre”][] = ’#NOM_SITE’;

      Cela se trouve à plusieurs endroits dans le code.

      Par contre, je ne sais pas pourquoi ça le faisait planter.

    • En effet, quand on retire le filtre majuscules, ca fonctionne parfaitement. Merci

    Reply to this message

  • 1

    merci beaucoup pour cet article très complet. il ne manque pas un point dans la boucle ARTICLES ?

      $string .= '[(#SOUSTITRE|supprimer_numero|texte_script) ]';
    • Effectivement... si un admin peut corriger...

    Reply to this message

  • 1

    Est-ce qu’on pourrait de la même manière récupérer des articles de différents sites syndiqués et puis les classer par date (indépendamment de leur origine sitistique) ?

    • Oui ça doit pouvoir marcher de la même façon.

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom