La création de la base de données, l'activation de PL/SQL et des fonctions de recherche plein texte ont déjà été décrites dans le billet précédent et sont toujours valables, je n'y reviens donc pas.

Isoler différents miroirs dans une même base

Comme PostgreSQL est trop cool, il est possible, au sein d'une même base de données, d'isoler plusieurs ensembles de tables grâce aux schéma. Il ne s'agit pas d'une isolation du même ordre qu'entre deux base de données car les tables des différents schémas sont visibles de tous. Par analogie avec Java, on peut dire qu'elles sont toutes cantonnées à un package ou un espace de nom en XML.

Quel est l'intérêt dans le cas présent ? Grâce à ce système d'isolation, nous allons pouvoir créer dans la même base de données plusieurs tables portant le même nom. Ceci va nous permettre de manipuler plusieurs bases mediawiki dans la même base de données, une pour Wikipédia Fr, une pour Wikipédia En et une pour Wikinews Fr par exemple !

  1. CREATE SCHEMA wikinewsfr;
  2. CREATE SCHEMA wikipediafr;
  3. CREATE SCHEMA wikipediaen;

Création des tables

Les tables sont créées à partir du modèle fourni en ligne, toutefois j'ai soumis un patch nécessaire pour permettre d'importer les données sans être super-utilisateur. Cette version intègre mes patchs... mais elle ne sera plus maintenu quand les patchs auront été intégrés.

Pour créer les tables dans un des schémas que l'on a créé précédemment, il faut spécifier ce dernier comme schéma par défaut :

  1. SET search_path TO wikinewsfr;

puis importer le code SQL de création des tables et penser à commiter à la fin :

mabase=> \i tables.sql
CREATE TABLE
...
CREATE TABLE
CREATE INDEX
mabase=> commit;
COMMIT

Vous pouvez alors vérifier que les tables ont bien été créées et qu'elle sont dans le bon schéma :

mabase=> \d
                       List of relations
   Schema   |            Name             |   Type   |   Owner
------------+-----------------------------+----------+-----------
 wikinewsfr | archive                     | table    | poulard-f
 wikinewsfr | category                    | table    | poulard-f
 wikinewsfr | category_cat_id_seq         | sequence | poulard-f
 wikinewsfr | categorylinks               | table    | poulard-f
 wikinewsfr | change_tag                  | table    | poulard-f
 wikinewsfr | external_user               | table    | poulard-f
 wikinewsfr | externallinks               | table    | poulard-f
 wikinewsfr | filearchive                 | table    | poulard-f
 wikinewsfr | filearchive_fa_id_seq       | sequence | poulard-f
...

Procédure d'importation

Il est possible d'importer la masse des données sans désactiver les triggers comme l'explique ce billet. J'ai soumis un nouveau patch qui remplace mon ancien afin de pouvoir réaliser l'importation sans être super-utilisateur. Une version patchée de mwdumper est disponible sur mon serveur (celle-ci force également les commits toutes les 10 pages).

La procédure d'importation doit alors inclure la sélection du schéma à utiliser, on fait donc précéder le flux SQL généré par mwdumper par une redéfinition du search_path. Attention à préciser le schéma public pour permettre l'accès aux fonctions de recherche plein texte qui y ont été définis. Il vous est toutefois possible de créer ces dernières dans le schéma.

Au final, on lance l'importation à l'aide de la commande suivante :

monuser$ (echo "SET search_path TO wikinewsfr,public;" ; java -jar mwdumper.jar --format=pgsql:1.5 frwikinews-20091113-pages-meta-history.xml.bz2) | psql mabase -q

J'ai rencontré quelques erreurs d'importation dues à la présence de référence à un utilisateur autre que l'utilisateur anonyme (c'est un problème d'anonymisation du dump visiblement). Pour éviter ce type d'erreur, il suffit de supprimer la contrainte de clé étrangère sur la table mwuser dans la définition de la table revision, aux environs de la ligne 91 dans le fichier tables.sql.

Si vous rencontrez une erreur incompréhensible lors de l'importation, la première étape pour l'isoler est de demander à psql de stopper à la première erreur rencontrée :

monuser$ (echo "SET search_path TO wikinewsfr,public;" ; java -jar mwdumper.jar --format=pgsql:1.5 frwikinews-20091113-pages-meta-history.xml.bz2) | psql mabase --variable ON_ERROR_STOP=

Filtrage des pages à extraire

Le dump actuel de Wikipédia pèse quelque chose comme 32Go compressé avec bzip2, soit environ 600Go décompressé ! Tout le monde ne peut pas stocker une telle masse de données. L'outil mwdumper permet de filtrer le contenu à exporter à partir du xml compressé à l'aide du paramètre --filter, les filtres possibles étant :

  • latest permet de ne conserver que la dernière révision des pages ;
  • namespace permet de spécifier quels types de pages conserver (ou ne pas conserver si précédé d'un !), les espaces de nom des pages possibles sont : NS_MAIN, NS_TALK, NS_MAIN, NS_TALK, NS_USER, NS_USER_TALK, NS_PROJECT, NS_PROJECT_TALK, NS_IMAGE, NS_IMAGE_TALK, NS_MEDIAWIKI, NS_MEDIAWIKI_TALK, NS_TEMPLATE, NS_TEMPLATE_TALK, NS_HELP, NS_HELP_TALK, NS_CATEGORY, NS_CATEGORY_TALK ;
  • notalk permet de filtrer les pages de discussion (équivalent à --filter=namespace:!NS_TALK) ;
  • titlematch permet de ne conserver que les pages dont le titre est reconnu par l'expression régulière en paramètre (ex: --filter=titlematch:A.*) ;
  • list permet de préciser, dans un fichier, une liste des pages à extraire ;
  • exactlist identique au filtre list si ce n'est que ce filtre ne recherche pas les pages de discussion associées ;
  • revlist permet de préciser, dans un fichier, les identifiants de révision à extraire ;
  • before permet de filtrer les révisions antérieures au timestamp passé en paramètre ;
  • after permet de filtrer les révisions postérieures au timestamp passé en paramètre ;

L'exemple ci-dessous illustre la mise en place du filtrage en restreignant l'exportation SQL aux articles de qualité d'après cette liste (on pourrait plutôt se référencer à cette page d'ailleurs) en ne considérant que les pages concernant le contenu de l'encyclopédie :

monuser$ java -jar mwdumper.jar --format=pgsql:1.5 --filter=list:articles-qualite-v20091119.txt --filter=namespace:NS_MAIN frwikinews-20091113-pages-meta-history.xml.bz2