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.
Discussions par date d’activité
4 discussions
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
Répondre à ce message
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
merci beaucoup pour cet article très complet. il ne manque pas un point dans la boucle ARTICLES ?
Effectivement... si un admin peut corriger...
Répondre à ce message
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 :
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.
Suivre les commentaires : |