[Doc] Alléger les tables phpbb_search_*

Découvrez ici une liste de documents concernant phpBB: son installation, sa mise à jour et enfin son utilisation.
En bref, apprenez ici à vous servir de phpBB2!

Modérateur: Equipe

[Doc] Alléger les tables phpbb_search_*

Messagede breakolami le 03 Oct 2003 à 15:05

» Alléger les tables phpbb_search_*
Lorsque vous tapez un message, tous les mots sont inscrits dans la base de données dans les tables phpbb_search_wordlist et phpbb_search_wordmatch
Il se trouve que ces 2 tables grossissent très vite voici donc un petit truc pour en diminuer la taille.
Il faut éviter d'indéxer les caractères uniques ainsi que les mots de 2 ou 3 lettres.



    » Il faut pour cela créer un fichier nommé search_stopwords.txt dans lequel vous allez entrer tout ce que vous voulez bloquer.
    (ce fichier existe dans le répertoire de langue anglaise)
    Dans ce fichier, entrez chaque mot sur une ligne et rien d'autre, exemple :

      oui
      non
      je
      tu
      il
      nous
      vous
      ils
      papa
      toto
      qui
      1
      2
      a
      b
      c

    » Vous pouvez ajouter ce que vous voulez et tout ce qui sera dans ce fichier ne sera plus inscrit dans la base.
    Une fois ce fichier créé, envoyez-le dans votre répertoire language/lang_french ou le répertoire de la langue que vous utilisez.
    Si vous utilisez plusieurs langues il vous faudra créer un fichier search_stopwords.txt pour chacune de ces langues.

    » Maintenant pour faire le ménage dans une base existante, copiez le code ci-dessous et créer un fichier php que vous nommez comme vous voulez.
    Code: Tout sélectionner
    <?php

    define('IN_PHPBB', true);
    $phpbb_root_path = './';
    include($phpbb_root_path . 'extension.inc');
    include($phpbb_root_path . 'common.'.$phpEx);
    include($phpbb_root_path . 'includes/functions_search.'.$phpEx);

    // Start session management
    $userdata = session_pagestart($user_ip, PAGE_SEARCH);
    init_userprefs($userdata);
    // End session management

    if ($userdata['user_level'] != ADMIN )
    {
       message_die(GENERAL_MESSAGE, 'Vous n\'êtes pas autorisé à éxécuter ce script !');
    }
       
    $stopwords_array = file($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . "/search_stopwords.txt");

    $liste='';
    foreach($stopwords_array as $curr_word)
    {
          $liste .= ( ( $liste != '' ) ? ', ' : '' ) ."'".trim($curr_word)."'";
    }

       $sql = "SELECT word_id
          FROM " . SEARCH_WORD_TABLE . "
          WHERE word_text IN ($liste)";
       if ( !($result = $db->sql_query($sql)) )
       {
          message_die(GENERAL_ERROR, 'Could not obtain common word list', '', __LINE__, __FILE__, $sql);
       }

       $common_word_id = '';
       while ( $row = $db->sql_fetchrow($result) )
       {
          $common_word_id .= ( ( $common_word_id != '' ) ? ', ' : '' ) . $row['word_id'];
       }

       if ($common_word_id=='')
       {
          message_die(GENERAL_ERROR,'Aucun des mots de la liste n\'a été trouvé dans vos tables de recherche.<br>Note: Celà peut également signifier que la liste est vide ;)');
       }

       $sql = "DELETE FROM " . SEARCH_WORD_TABLE . "
          WHERE word_id IN ($common_word_id)";
       if ( !$db->sql_query($sql) )
       {
          message_die(GENERAL_ERROR, 'Could not delete word match entry', '', __LINE__, __FILE__, $sql);
       }
       $sql = "OPTIMIZE TABLE " . SEARCH_WORD_TABLE;
       if ( !$db->sql_query($sql) )
       {
          message_die(GENERAL_ERROR, 'Could not optimize', '', __LINE__, __FILE__, $sql);
       }

       $sql = "DELETE FROM " . SEARCH_MATCH_TABLE . "
          WHERE word_id IN ($common_word_id)";
       if ( !$db->sql_query($sql) )
       {
          message_die(GENERAL_ERROR, 'Could not delete word match entry', '', __LINE__, __FILE__, $sql);
       }
       $sql = "OPTIMIZE TABLE " . SEARCH_MATCH_TABLE;
       if ( !$db->sql_query($sql) )
       {
          message_die(GENERAL_ERROR, 'Could not optimize', '', __LINE__, __FILE__, $sql);
       }
       
       message_die(GENERAL_MESSAGE,'<b>Terminé !</b><br /><br />Les mots suivants ont été retirés de vos tables de recherche :'.$liste);

    ?>

    » Envoyez ce fichier à la racine de votre forum puis appelez-le depuis votre navigateur en tapant l'adresse de votre forum/le_fichier.php
    Ce script va lire les mots que vous avez placés dans le fichier search_stopwords.txt et va les supprimer de la base de données.

    » Une fois que cela est fait passez sur phpmyadmin ou eskuel en mode requette manuelle et éxécutez cette requette :
    Code: Tout sélectionner
    SELECT ls.word_id, ls.word_text, COUNT(wm.word_id) as entries FROM `phpbb_search_wordlist` as ls LEFT JOIN `phpbb_search_wordmatch` as wm ON ls.word_id=wm.word_id GROUP BY wm.word_id ORDER BY entries DESC LIMIT 0,100


    » Cette requette va afficher sur trois colonnes la liste des 100 mots les plus utilisés dans votre base, choisissez dans cette liste les mots que vous souhaitez bloquer et supprimer de votre base et ajoutez-les dans le fichier search_stopwords.txt, ré-uploadez-le et relancez le script.
    Vous pouvez afficher plus de mots en modifiant à la fin de cette commande le DESC LIMIT 0,100 changez la valeur 100 par ce que vous voulez sans éxagérer (le résultat sera un peu plus long à s'afficher)

    » Répetez cette opération autant de fois que vous voulez.
    Une fois que vous avez fini, pensez à supprimer le script de votre ftp par mesure de sécurité.
    Conservez-le pour une utilisation ultérieure.

    » Par la suite, si vous pensez que d'autres mots doivent être bloqués, ajoutez-les simplement dans le fichier search_stopwords.txt et ré-uploadez-le.

      » Dans votre fichier search_stopwords.txt commencez par insérer les lettres de l'alphabet de a à z ainsi que les chiffres de 0 à 9 toujours un par ligne.
      » Si vous voulez ensuite ajouter encore d'autres mots, allez dans votre base sur la table phpbb_search_wordlist en mode affichage et regardez les mots qui sont toujours dans la table, si vous en voyez que vous jugez inutiles, ajoutez-les dans le fichier search_stopwords.txt, ré-uploadez-le et relancez le script.
      » Je sais, ceux qui ont déjà beaucoup de messages vont me dire que cette opération prend du temps mais on a rien sans rien et de plus on est pas obligé de faire ça, c'est juste un petit plus.
      » Vous n'êtes pas non plus obligé de faire tout en une seule fois, un petit peu chaque jour, vous notez le word_id où vous vous êtes arrêté et vous reprenez le lendemain et lorsque vous êtes arrivé au bout de la liste, ré-uploadez le fichier search_stopwords.txt et relancez le script de nettoyage.

    Image Lorsque vous installez un forum phpBB tout neuf, pensez à créer le fichier search_stopwords.txt dès le départ de façon à bloquer d'entrée tous ces mots inutiles.
    Je sais qu'il n'est pas évident de trouver de tête la liste complète mais vous pouvez ajouter au fur et à mesure autant de mots que vous souhaitez et lancer le script de nettoyage quand vous voulez.


    Image Si cette explication n'est pas claire ou vous pose un problème, n'hésitez-pas à utiliser le forum


_________________________________________________

breakolami :D

modani script traduit et optimisé [11-02-05]
Avatar de l’utilisateur
breakolami
Grand-maître des floodeurs
Grand-maître des floodeurs
 
Messages: 3502
Inscription: 02 Juil 2002 à 19:35
Localisation: Champigny

Messagede breakolami le 25 Oct 2003 à 12:20

Petite précision :
Je viens d'utiliser ma méthode pour reconstruire mes tables de recherche et je me suis rendu compte de quelque chose d'important.

Lorsque vous utilisez le MOD Rebuild Search pour reconstruire vos tables cela prends un certain temps en fonction du nombre de messages que contient votre forum.
(sur mon forum avec un peu plus de 7000 messages cela a duré 20 minutes)
La durée est multipliée par 10 si vous laissez le fichier search_stopwords.txt dans le répertoire lang_french.

Donc, la meilleure solution est :

    1 - Supprimer le fichier search_stopwords.txt (sauvegardez-le avant de l'effacer)
    2 - Lancez Rebuild Search pour reconstruire vos tables
    3 - Ré-uploadez le fichier search_stopwords.txt
    4 - Utilisez à nouveau le script qui retire les mots indésirables de vos tables
    5 - Optimisez vos tables
Avatar de l’utilisateur
breakolami
Grand-maître des floodeurs
Grand-maître des floodeurs
 
Messages: 3502
Inscription: 02 Juil 2002 à 19:35
Localisation: Champigny

Messagede Genova le 13 Oct 2004 à 09:46

Je précise qu'il existe un MOD permettant de faire toutes ces actions automatiquement. Ce MOD est basé sur ce tutoail, il permet de créer votre fichier de mots interdits via votre panneau d'administration, de voir directement les mots les plus utilisés et de kes rajouter a la liste en les cochants ci besoin :)

http://forums.phpbb-fr.com/viewtopic_46695.html
Avatar de l’utilisateur
Genova
Pistolero des MODs
 
Messages: 7568
Inscription: 18 Nov 2003 à 18:45
Localisation: En train de programmer, logique non?

Messagede Cheval-furtif le 31 Juil 2005 à 18:47

Il y a de cela plusieurs mois déjà, Giefca a trouvé un disfonctionnement dans le code de la fonction recherche de phpBB. En effet normalement les mots de moins de 3 caractères et de plus de 20 caractères ne devraient pas être enregistrés dans la table phpbb_search_wordlist. Hors quand on regarde le contenue de cette table, on trouve les mots et, la, là, de et beaucoup d'autres encore alors que normalement ils ne devraient pas y être ! Giefca avait donc rapporter ce bug au Group phpBB mais celui ci considère que la méthode actuelle marche parfaitement alors qu'en réalité elle est obselète... Il y a de cela quelques semaines nous avons nous même (L'équipe de phpBB-fr) recontacté le Group phpBB et on nous à dit que cela ne changerait pas...

Mais comme leur code ne marche pas et que la langue française est truffée de petits mots, nous décidons de conseiller à nos membres d'appliquer le correctif de Giefca que voici:
Code: Tout sélectionner
#
#--[ OUVRIR ]
#
includes/functions_search.php

#
#--[ CHERCHER ]
#
   if ( $mode == 'post' )
   {
      $entry = str_replace('*', ' ', $entry);

      // 'words' that consist of <3 or >20 characters are removed.
      $entry = preg_replace('/[ ]([\S]{1,2}|[\S]{21,})[ ]/',' ', $entry);
   }

#
#--[ REMPLACER PAR ]
#

   if ( $mode == 'post' )
   {
           $entry = str_replace('*', ' ', $entry);

           // 'words' that consist of <3 or >20 characters are removed.
           $split = explode(' ', $entry);
           $taille_split = sizeof($split);       
           for ($i = 0; $i < $taille_split; $i++)
           {
              $split[$i] = trim($split[$i]);
              if ((strlen($split[$i]) < 3) || (strlen($split[$i]) > 20))
              {
                 $split[$i] = '';
              }
           }
           $entry = implode(' ', $split);
     }


Nous avons également décidé d'inclure les fichiers search_stopwords.txt et search_synonyms.txt dans notre traduction française. Nous vous conseillons également d'appliquer sans tarder la méthode breakolami pour épurer vos tables.

Chers membres, à vos claviers ! :wink:
Alec ;)
Avatar de l’utilisateur
Cheval-furtif
Dieu des floodeurs
Dieu des floodeurs
 
Messages: 6643
Inscription: 12 Jan 2004 à 10:07
Localisation: France


Retourner vers [phpBB 2.0.x] Forum de documentation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

Liens : phpBB.biz • phpBBHacks.com • phpBB-Seo.com • EzCom-fr.com • phpBB-Services.com • Net Avenir • PromoBenef • Ticket Gagnant •