Présenter les résultats de recherche comme un « vrai » moteur

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

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.

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

    Répondre à ce 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

    Répondre à ce 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...

    Répondre à ce 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.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom