Mot-clé - tsearch2

Fil des billets - Fil des commentaires

samedi, juillet 7 2007

Prato 2 : pgdays.it, confs techniques (enfin :) )

Beaucoup de bonnes conférences aujourd'hui, principalement celles des hackers PostgreSQL.

Josh a ouvert le bal avec une conférence sur les nouveautés de PostgreSQL 8.3. Il a d'abord confirmé qu'il fallait de plus en plus de temps pour valider les patchs que pour les écrire... du coup, il y a quelques bouchons sur la voie de la 8.3 mais cela devrait quand même déboucher sur une version vraiment majeure (en tout cas plus que la 8.2). Sortie maintenant prévue en septembre/octobre (de cette année :) ). D'après lui, les performances de la 8.2 se situent entre MySQL5 et Oracle. En dehors de ce commentaire subjectif (à mon avis), il a entamé la liste des améliorations de la 8.3 : Hot updates (j'ai pas bien pigé le fonctionnement, mais il semble que ça ne fera gagner énormément en perfs que pour peu d'applications), amélioration du cache des requêtes, des ORDER BY...LIMIT, des checkpoints, de l'autovacuum. La réduction du volume des WAL pour les opérations COPY et CLUSTER devrait être un des points majeurs de cette version. Il y aurait aussi une grosse amélioration des parcours séquentiels dans le cas où plusieurs backends font le même seqscan en même temps mais j'avoue que là non plus je n'ai pas pigé comme cela devait fonctionner. Dans les améliorations sympas, le XML dans core, la gestion des ENUM, les curseurs qu'on peut mettre à jour, l'index advisor (que Josh lui-même n'a pas voulu expliquer :) ), le OLAP window (ça, ce fut une découverte pour moi, je croyais que Gavin n'avait pas eu le temps de terminer ce patch et qu'il avait donc été repoussé pour la 8.4).

Il a poursuivi sur une deuxième conf : cinq ensembles de conseils pour améliorer les performances. Absolument génial. Le contenu est déjà bien connu, certains points méritent d'être testés, mais dans l'ensemble c'est du très bon.

Hans-Jurgen Schonig a fait une prestation très remarqué. Il était marrant, simple, et compréhensible sur un sujet plutôt complexe : la réplication, et notamment la réplication multi-maître. On a eu droit à un vrai show, c'était excellent :)

continuent est venu faire sa pub, donc je n'en parlerais pas plus. Je me suis juste bien emmerdé pendant cette conf.

Mitani a présenté PGCluster et PGCluster2. En bref, utiliser le premier si 90% de vis requêtes sont des requêtes de lecture. Sinon utiliser le deuxième. Sachez tout de même que les performances sont assez décevantes.

La conférence d'Oleg Bartunov sur TSearch2 était géniale. Seul bémol, sa façon à passer très rapidement de slide en slide, parfois même en marche arrière... difficile de suivre dans ces conditions. Néanmoins, il a abordé beaucoup de points sur les différentes possibilités de TSearch2 et ajouté quelques infos sur la version qui sera incluse dans la 8.3. Il faut absolument que je récupère les slides d'Oleg (il me semble qu'il a utilisé celles de sa présentation lors de PGCon2007).

La pause déjeuner m'a permis de discuter beaucoup avec Dave Page pendant que Jean-Paul se faisait interviewer avec de nombreux hackers. Nous avons échangé quelques idées sur ce qu'il fallait faire pour la prochaine version de pgAdmin. J'ai du boulot en vue... Attendez-vous aussi à la première beta vendredi de cette semaine ou peu après.

L'après-midi a été moins intéressante, peut-être aussi est-ce dû à la fatigue. David Fetter a fait deux conférences très intéressantes sur DBILink et PL/Perl. Je ne suis pas un adorateur de Perl mais j'ai quand même été séduit par les deux confs de David. Beaucoup d'humour, beaucoup d'infos, une envie de faire participer le public (ce qui est bien, ça a un peu réveillé tout le monde... entre le repas et la chaleur, tout le monde peinait).

Andreas a fait une conf intéressante sur son module tablelog. Je vois bien son intérêt mais aussi son gros inconvénient. Un INSERT sur une table tracée revient à deux opérations d'écriture (une pour la table tracée, une autre pour la table de log).

Il y a eu ensuite une conférence sur PostgreSQL versus MySQL. Je ne vois pas l'intérêt de ce genre de conférences, donc j'ai zappé.

La dernière conférence était vraiment excellente. Simon Riggs a tenté d'expliquer un maximum de choses sur PITR en une demi-heure. Mission impossible, mais en fait il s'est quand même bien débrouillé. J'en ai un peu discuté avec lui après. Pour moi, sa conf aurait dû durer deux heures. Enfin, l'important, c'est qu'il a réussi à démontrer la robustesse de PITR et c'est à mon avis le plus important pour les nouvelles fonctionnalités.

Après les confs, il y a eu une réunion sur la constitution d'un groupe européen. Peu de choses en sont sorties. Le plus important a été, à mon avis, qu'on se rencontre tous (enfin presque tous), qu'on ait un visage sur chaque nom, sur chaque pseudo. Ça aide à s'unir, à s'entraider. Le reste va pouvoir débuter sur la liste de discussions.

La galerie du jour...

mardi, mai 22 2007

Ajout de la recherche sur docs.pgfr.org

Oula, ceux qui ont pigé, pas la peine de vous précipiter, ce n'est pas encore disponible. Pour les autres, un petit résumé... Le site de la documentation française de PostgreSQL contient les manuels des versions 7.4, 8.0, 8.1 et 8.2. Évidemment, avec leurs quelques 700 pages web par manuel, il n'est pas toujours évident de trouver l'information recherchée. Il est toujours possible de passer par Google mais ce n'est pas vraiment simple. J'ai donc profité de la semaine dernière pour incorporer un moteur de recherche puissant mais simple d'utilisation.

Justement, PostgreSQL dispose d'un module contrib proposant la recherche plein texte (très mauvaise traduction de Full Text Indexing, FTI pour les intimes). Ce module, nommé TSearch2, doit être ajouté à une base et permet l'indexation de gros volume de texte. Après avoir compris l'installation et l'utilisation de TSearch2, il ne me restait plus qu'à placer les manuels dans une base PostgreSQL, ajouter le module TSearch2 à cette base et construire une interface pour interroger la base.

La compilation/installation de TSearch2 est simplissime avec les patchs et archives tar de Cédric. En gros, vous récupérez le stemmer français UTF-8, stemmer_utf8_french.tar.gz, que vous déballez dans le sous-répertoire contrib/tsearch2 du répertoire des sources. Récupérez ensuite le premier patch, tsearch_snowball_82, qui est la version compatible avec les derniers stemmers snowball. Appliquez le à partir de la base des sources (un simple « patch -Np0 < tsearch_snowball_82 » suffira). Enfin, récupérez le patch de Cédric ajoutant par défaut le dictionnaire français UTF-8, 61-tsearch-french-utf8.diff. Appliquez-le aussi à partir de la racine des sources. Compilez TSearch2 et installez-le (« make && make install »). Et voilà, c'est terminé. Il ne vous reste plus qu'à exécuter le fichier tsearch2.sql sur votre base et vous disposerez du module pour cette base.

Si vous voulez en plus le dictionnaire ispell, récupérez aussi l'autre archive tar de Cédric, ispell_utf8_french.tar.gz. Par contre, cela nécessitera des modifications dans les tables de configuration de TSearch2, l'installation n'est pas automatique comme avec le stemmer.

L'intégration des documents en base paraît assez simple. Il suffit d'écrire un petit script qui lit le contenu de chaque page et l'intègre dans un champ d'une table spécifique. La table en question, que l'on nommera pages, contient plusieurs champs :

  • un id ;
  • le nom du fichier ;
  • la version du manuel auquel appartient ce fichier ;
  • le contenu de ce fichier.

Je vais passer sur les détails. En regardant les mots indexés, je me suis aperçu que je ne pouvais pas intégrer le contenu complet du fichier, y compris une fois débarrassé des balises HTML. Seule une partie de ce fichier a un contenu intéressant... le reste, c'est par exemple le titre du chapitre précédent et suivant (inutile, voire trompeur pendant une recherche). Donc, il a fallu détecter l'endroit exact du contenu réel. Celui-ci est différent pour un chapitre, une partie, une page man, une section, etc. Ceci fait, TSearch2 étant capable de donner un poids plus ou moins fort à des champs différents, j'ai ajouté un champ titre, un champ tags1 (contenant les mots indexés grâce à la balise DocBook firstterm) et un champ tags2 (même chose pour la balise secondterm). J'ai enfin ajouté une dernière colonne de type tsvectors et contenant la vectorisation des quatre champs. Le script d'intégration des documents commence par supprimer les pages déjà enregistrées pour la version du manuel que l'on souhaite intégrer, copie les documents en base après les avoir disséqués, met à jour la colonne de vectorisation et exécute un « VACUUM FULL ANALYZE ». Une fois les quatre versions intégrées, il a fallu construire le script PHP de recherche.

Pour cette page, j'ai utilisé un autre patch de Cédric (décidément :) ). Il s'agit d'un patch pour wikimedia, transformant les critères de recherche « compréhensibles par un humain » en critères de recherche compréhensibles par TSearch2. Je l'ai donc intégré dans le script de recherche. Une fois ces critères transposés pour TSearch2, il ne reste plus qu'à envoyer la requête au serveur :

SELECT version, url, titre, headline(contenu, q) AS resume, to_char(rank(fti, q)*100, '99.99') AS score
FROM pages, to_tsquery('critère de recherche') AS q
WHERE fti @@ q
ORDER BY rank(fti, q) DESC

Si une version est précisée, la requête filtre aussi par cette version. Je dois avouer que cela remplit bien son oeuvre. Évidemment, il manque certaines choses comme une pagination (avoir 500 résultats sur une même page, c'est long et fastidieux) et une page d'explication sur les critères de recherche. Mais bon, le principal est là.

Le résultat n'est pour l'instant pas disponible. La machine qui héberge docs.pgfr.org héberge un serveur PostgreSQL 8.1, or il me faudrait une version 8.2... et d'autres bases existent sur ce serveur, il ne sera donc pas simple de migrer. En tout cas, ce n'est pas possible actuellement.

jeudi, décembre 21 2006

En vrac

Développement

PostgreSQL

AJAX

Photos

Sécurité

Divers