Moteur de recherche à la Google avec SPIP :)

(Je ré-envoie, je crois que j'ai encore fait une erreur d'adresse d'envoi... Désolé pour le doublon, stupid me -_-)

Bonjour bonjour...
Voilà, ça fait quelques mois que je bosse toujours sur mon squelette SPIP "inspiré d'EVA" pour mon site Cyna.net (basé sur le moteur SPIP 1.6 RC1 légèrement modifié), il y a quelques temps j'avais demandé de l'aide pour accélérer la gestion des archives de mon blog par mois, et on m'avait pointé vers le code mis à jour de SPIP 1.6 qui permettait de faire un tri par date, ce qui m'a bien aidé merci beaucoup... :slight_smile:
Ces temps-ci je m'attache à essayer d'améliorer le moteur de recherche de base pour lui donner une allure plus Googlienne.
Mes buts étaient donc de :
- donner une arborescence aux articles trouvés
- reproduire, pour chaque article, la première portion où l'on peut trouver le mot cherché, en mettant en gras le mot en question.

Alors ma question ne sera pas "Comment faire ?", et à ce propos je vous invite à visiter le squelette de la page recherche, où j'ai effectivement pu implémenter cette solution (qui logiquement devrait pouvoir fonctionner sur tout type de site) avec un peu de PHP :
http://cyna.net/recherche.html (*)
Mais ça serait plutôt "Comment accélérer le résultat ?", afin d'éviter, comme pour mon premier problème, le fameux problème de timeout...
En effet, Google est des plus rapides, mais ici je peine à renvoyer la première page de résultats en moins de 5 secondes...!
http://cyna.net/recherche.php3?recherche=seiya
"Seiya" est un mot très utilisé sur mon site (logique, il est consacré principalement à Saint Seiya). J'ai 184 articles qui comprennent le mot, et les 5 premiers sont des articles assez longs, voire carrément très longs (15 à 30ko je crois). Le problème c'est que j'ai souvent un timeout sur la première page, alors que les suivants donnent des résultats acceptables, comme :
http://cyna.net/recherche.php3?recherche=seiya&debut_lb=140
Qui prend quoi ? 2-3 secondes à s'afficher... Ce qui me paraît tout à fait "correct".

Alors donc voilà, je suis un peu perdu, et je ne sais pas trop comment accélérer le système... Je suppose qu'il va falloir tripatouiller dans le code de SPIP pour ça... :-/
Est-ce que quelqu'un aurait une idée ? Je pense que le squelette que j'ai développé hier pourrait être utile à beaucoup de gens, donc ça serait bien de l'optimiser tous ensemble !

Sinon, il me reste aussi globalement deux petits problèmes à régler :

- Toujours dans le moteur de recherche, la colonne de gauche affiche, dans ses liens, des "?var_recherche" qui ne devraient pas s'y trouver, et qui n'ont aucun rapport avec le mot actuellement recherché....! Ici il me donne "maman", un mot que j'ai utilisé une seule fois hier pour tester le moteur (le reste du temps j'utilisais d'autres mots). Les URL utilisent simplement #URL_RUBRIQUE, et on peut trouver le source de cette colonne ici : http://cyna.net/leftheader.html
Je suppose qu'il s'agit d'un problème avec inc-urls, que je pourrais régler aisément en enlevant la ligne concernant la recherche de la section qui détermine l'URL des rubriques... Mais il s'agit peut-être aussi d'un bug ? Y gagnerais-je vraiment à passer à SPIP 1.6 final, sachant que je n'utilise pas les fonctionnalités multilingues ?

- Sous MSIE, quand je passe d'une page à une autre (deux pages déjà chargées dans le cache de MSIE), il y a toujours un reload implicite. Alors que sur mon encyclopédie (cyna.net/ency.html), quand je passe d'une page à une autre, c'est instantané ! (Je précise que c'est la seule section de mon site à ne pas être réalisée sous SPIP et à ne pas bénéficier d'un cache interne...!)
J'avoue ne pas comprendre... :-/

- Enfin, j'ai des difficultés avec le système de commentaires... Quand on envoie un post en réponse à un autre commentaire, il apparaît au final comme un post "à part" ; j'ai vérifié la base de données, et les entrées id_parent sont toutes à zéro... Je ne sais pas quel changement j'ai pu faire au code de SPIP (ou à celui de mon squelette ?) pour en arriver là... :-/

En attendant j'espère que le site vous plaira, son design est quasiment terminé et là j'en suis vraiment aux derniers petits détails... Dans l'ensemble je suis très content, il ne reste plus qu'à le remplir, le moins dur à mon goût :wink:

(*) Mon code utilise un filtre, que j'ai placé dans ecrire/inc_filtres.php3, mais qu'on peut mettre dans mes_fonctions.php3 aussi j'imagine :

// Texte_brut + texte_script pour travail sous PHP
function extrait($texte) {
         $texte = ereg_replace("[\n\r]+", " ", $texte);
         $texte = eregi_replace("<(p|br)([[:space:]][^>]*)?".">", " ", $texte);
         $texte = ereg_replace("^\n+", "", $texte);
         $texte = ereg_replace("\n+$", "", $texte);
         $texte = ereg_replace("\n +", " ", $texte);
         $texte = ereg_replace("<[^>]*>", "", $texte);
         $texte = ereg_replace("(&nbsp;| )+", " ", $texte);
         $texte = str_replace('<br>', ' ', $texte);
         $texte = str_replace('\\', '\\\\', $texte);
         $texte = str_replace('\'', '\\\'', $texte);
         return $texte;
}

Je ne sais pas trop si je dois poster ceci sur la ML SPIP où je suis, ou sur l'autre destinée aux développeurs (ou je ne suis pas...), comme il s'agit d'un squelette je vote pour ici...

At 17:56 25/08/2003 +0200, Naoki Haga wrote:

Alors donc voilà, je suis un peu perdu, et je ne sais pas trop comment accélérer le système... Je suppose qu'il va falloir tripatouiller dans le code de SPIP pour ça... :-/
Est-ce que quelqu'un aurait une idée ? Je pense que le squelette que j'ai développé hier pourrait être utile à beaucoup de gens, donc ça serait bien de l'optimiser tous ensemble !

function extrait($texte) {
        $texte = ereg_replace("[\n\r]+", " ", $texte);
        $texte = eregi_replace("<(p|br)([[:space:]][^>]*)?".">", " ", $texte);
        $texte = ereg_replace("^\n+", "", $texte);
        $texte = ereg_replace("\n+$", "", $texte);
        $texte = ereg_replace("\n +", " ", $texte);
        $texte = ereg_replace("<[^>]*>", "", $texte);
        $texte = ereg_replace("(&nbsp;| )+", " ", $texte);
        $texte = str_replace('<br>', ' ', $texte);
        $texte = str_replace('\\', '\\\\', $texte);
        $texte = str_replace('\'', '\\\'', $texte);
        return $texte;
}

J'ai modifié la fonction extrait pour donner ceci :

function extrait($texte) {
         $texte = ereg_replace("[\n\r]+", " ", $texte);
         $texte = eregi_replace("<(p|br)([[:space:]][^>]*)?".">", " ", $texte);
         $texte = ereg_replace("^\n+", "", $texte);
         $texte = ereg_replace("\n+$", "", $texte);
         $texte = ereg_replace("\n +", " ", $texte);
         $texte = ereg_replace("(&nbsp;| )+", " ", $texte);
         $texte = str_replace('<br>', ' ', $texte);
         return $texte;
}

et ajouté une fonction qui combine texte_script et supprimer_tags (permettant, je suppose, d'éviter plusieurs transferts du contenu de "$texte"...)

function texte_script_supprimer_tags($texte) {
         $texte = str_replace('\\', '\\\\', $texte);
         $texte = str_replace('\'', '\\\'', $texte);
         $texte = ereg_replace("<[^>]*>", "", $texte);
         return $texte;
}

Je ne sais pas si je gagnerais des cycles en faisant return sur la dernière fonction de transformation plutôt que de faire un dernier passage par $texte, mais là n'est pas la question...

Ensuite, dans mon code squelette j'ai mis ceci :

         $tx = '[(#CHAPO|texte_script_supprimer_tags) -]
                 [(#TEXTE|texte_script_supprimer_tags)]
                 [ - PS: (#PS|texte_script_supprimer_tags)]';
         $temp = stristr($tx,$recherche);
         if ($temp == "") { $pos = 0; } else { $pos = strlen($tx)-strlen($temp); }
         $tx = substr($tx, max(0, $pos-200), 400+strlen($recherche));
         $tx = extrait($tx);
         echo "...".preg_replace('/('.$recherche.')/i','<b>$1</b>',$tx)."...";

Bref, j'évite d'appliquer des remplacements inutiles à l'intégralité du texte de l'article. Je ne fais que le transformer pour ne plus avoir de tags et pouvoir le mettre dans une chaîne... Ensuite je prends juste les 400 caractères qui m'intéressent, et là j'applique le reste du filtre. Ca n'est pas franchement extraordinaire, mais bon... Ca marche un peu mieux... A la base j'avais omis supprimer_tags, et je me retrouvais à un moment avec un <i class="spip" qui était coupé à la fin, donc non reconnu au moment de virer les tags, et hop, le reste de la page était en italiques... -_-

Je suis vraiment embêté par tous ces cas où #TEXTE totalise plus de 10000 caractères et provoque un timeout...
Je ne sais pas si je suis ou non sur la bonne voie :-/