SlideShare a Scribd company logo
1 of 38
Download to read offline
Indexation d’une base documentaire pour le
            quotidien Libération

           Gaël L E M IGNOT — Pilot Systems


                              25 juin 2010




      Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Plan
  1    Introduction
  2    Architecture
         Architecture actuelle
         Nouvelle architecture
         Premières expériences
  3    Nécessité d’une heuristique
         Analyse des résultats
         Définition de l’heuristique
         Finitions
  4    Contributions et partitions
         Ajout des contributions
         Utilisation des partitions
  5    Accès concurrents
  6    Conclusion
               Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Contexte
  Contexte général
      Quotidien Libération
      Utilisation en back-office dans un premier temps
      Utilisation en frontal prévue pour l’avenir

  Utilisation de la recherche
        Navigation
      Recherches simples
      Recherches documentaires

  Solution actuelle
      Propriétaire, sous Windows (TextML)
      Problèmes de performances et de stabilité
             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Base d’indexation

  Volumétrie
      583 675 articles
      140 870 pages
      1 134 382 contributions (non indexées dans TextML)
      104 595 contenus divers

  Types d’index
      Recherche en texte plein
      Recherche sur texte exact
      Filtres sur des méta-données : auteurs, catégories, . . .
      Tri par date


             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Interface de recherche




          Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Architecture




                     Architecture




          Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Schéma de l’architecture actuelle




          Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Schéma de la nouvelle architecture




          Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Points clés de la nouvelle architecture

  Avantages directement recherchés
      Performances et stabilité
      Possibilité d’indexer les contributions
      Possibilité d’aller vers l’utilisation en frontal
      Contrôle plus fin du comportement

  Avantages connexes
      Gestion des dépendances
      (entre auteurs et articles par exemple)
      Ré-indexation massive facilitée
      Ré-indexation partielle possible
      Plus grande liberté de recherche

             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Première approche

  Structure de la base
      Une seule table, libeindex
      classname et id comme clé primaire
      Nombreuses colonnes, dont des champs en tsvector

  Matériel et logiciel
      Machine virtuelle sous Xen
      Debian 5.0
      PostgreSQL 8.3
      Deux cœurs dédiés à la machine virtuelle
      Mémoire variant de 4Go à 12Go suivant les tests


              Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Premiers résultats
  Modalités de mesure
     Log des requêtes effectuées en production
      Deux périodes : 10 au 19 juin, et 1er juillet au 19 août
      Envoi séquentiel dans n threads, par défaut 1

  Résultats statistiques sur la première version




             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Exemple de requête
  La requête
  SELECT classname, id, modifiedAt
  FROM libeindex
  WHERE fulltext_tsv @@ plainto_tsquery(’public.simple_french’, ’gauche’)
  ORDER BY modifiedAt DESC LIMIT 20;




  Le query plan
   Limit  (cost=3.03..3.03 rows=3 width=19)
          (actual time=25657.959..25658.011 rows=20 loops=1)
     -> Sort (cost=3.03..3.03 rows=3 width=19)
               (actual time=25657.955..25657.971 rows=20 loops=1)
           Sort Key: modifiedat
           Sort Method: top-N heapsort Memory: 26kB
           -> Bitmap Heap Scan on libeindex
               (cost=1.47..3.00 rows=3 width=19)
               (actual time=559.153..25568.663 rows=46328 loops=1)
                 Recheck Cond: (fulltext_tsv @@ ’’’gauche’’’::tsquery)
                 -> Bitmap Index Scan on libeindex_fulltext_index
                     (cost=0.00..1.47 rows=3 width=0)
                     (actual time=548.904..548.904 rows=46328 loops=1)
                       Index Cond: (fulltext_tsv @@ ’’’gauche’’’::tsquery)
   Total runtime: 25658.085 ms




                 Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Nécessité d’une heuristique




  Nécessité d’une heuristique




          Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Émergence de l’idée


  Constatations
     Les requêtes sont lentes quand les termes recherchés
     sont très fréquents.
      Cependant, seules certaines de ces requêtes sont lentes.
      La plupart des requêtes demandent les 20, 50 ou 100
      éléments les plus récents.

  Conclusion
  PostgreSQL se trompe donc parfois de query plan.




            Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Explication : terme rare




           Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Explication : terme fréquent




           Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Optimisation manuelle de la requête

  La requête
  SELECT classname, id, modifiedAt
  FROM (SELECT * FROM libeindex ORDER BY modifiedAt DESC LIMIT 2500) subquery
  WHERE fulltext_tsv @@ plainto_tsquery(’public.simple_french’, ’gauche’)
  ORDER BY modifiedAt DESC LIMIT 20;




  Le query plan
   Limit  (cost=0.00..1100.22 rows=12 width=528)
          (actual time=150.467..651.747 rows=20 loops=1)
     -> Subquery Scan subquery (cost=0.00..1100.22 rows=12 width=528)
                                 (actual time=150.464..651.701 rows=20 loops=1)
           Filter: (subquery.fulltext_tsv @@ ’’’gauche’’’::tsquery)
           -> Limit (cost=0.00..1068.97 rows=2500 width=1418)
                      (actual time=29.239..288.642 rows=426 loops=1)
                 -> Index Scan Backward using libeindex_modifiedat_index on libeindex
                     (cost=0.00..359616.93 rows=841035 width=1418)
                     (actual time=29.237..287.880 rows=426 loops=1)
   Total runtime: 651.841 ms




                 Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Fonctionnement de l’heuristique



  Principe de l’heuristique
      On commence par faire une subquery sur les éléments
      récents uniquement.
      Plan A : recherche sur un petit nombre d’éléments récents.
      Plan B : comme le plan A, mais sur plus d’éléments.
      Plan C : recherche classique, sans subquery.




             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Algorithme




  Légende
     INITIAL = 2500, THRESOLD = 0.35, MARGIN = 3.0
                found
     ratio =   wanted

             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Résultats

  Résultats statistiques




  Analyse des résultats
      Résultats globalement très satisfaisant.
      Requête la plus lente : « france 2 »

             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Améliorations mineures
  Listes des améliorations mineures
       Index croisés sur classname et les champs dates.
      Paramétrage de l’heuristique.
      PostgreSQL 8.4, avec un statistics à 10 000.

  Résultats statistiques




             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Requêtes courtes et longues

  Limitations imposées par l’heuristique
      Pas de décompte du nombre de résultats.
      Pas de pagination possible.

  Solution
      Définition de deux méthodes dans SeSQL.
      Short queries pour la navigation ou les recherches
      simples.
      Long queries pour les recherches documentaires, plus
      spécifiques.
      Amélioration possible : faire une short query pour afficher
      la première page, et en tâche fond effectuer la long query.

             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Contributions et partitions




    Contributions et partitions




           Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Ajout brutal
  Expérience
      Ajout des contributions dans la base, sans autre
      modification.
      Les requêtes ne portent pas sur les contributions.

  Résultats statistiques




             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Partitions PostgreSQL
  Description
      Objectif : séparer les contributions des autres contenus.
      Utilisation de l’héritage de tables.
      Utilisation des contraintes sur les sous-tables.

  Résultats




              Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Exemple de requête




  La requête
  SELECT classname, id, createdAt
  FROM (SELECT * FROM libeindex WHERE (classname=’article’)
                                 ORDER BY createdAt DESC LIMIT 2500) subquery
  WHERE fulltext_tsv @@ plainto_tsquery(’public.simple_french’, ’gauche’)
  ORDER BY createdAt DESC LIMIT 20;




                 Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Exemple de requête (suite)

  Le query plan
  Limit  (cost=75939.11..75976.61 rows=12 width=528)
         (actual time=6158.547..6161.066 rows=20 loops=1)
    ->  Subquery Scan subquery (cost=75939.11..75976.61 rows=12 width=528)
                                (actual time=6158.544..6161.027 rows=20 loops=1)
          Filter: (subquery.fulltext_tsv @@ ’’’gauche’’’::tsquery)
          -> Limit (cost=75939.11..75945.36 rows=2500 width=1495)
                     (actual time=6158.128..6158.700 rows=203 loops=1)
                -> Sort (cost=75939.11..77434.83 rows=598286 width=1495)
                          (actual time=6158.125..6158.331 rows=203 loops=1)
                      Sort Key: public.libeindex.createdat
                      Sort Method: top-N heapsort Memory: 3634kB
                      -> Result (cost=0.00..39181.28 rows=598286 width=1495)
                                  (actual time=0.064..3878.206 rows=583675 loops=1)
                            -> Append (cost=0.00..39181.28 rows=598286 width=1495)
                                        (actual time=0.060..2360.568 rows=583675 loops=1)
                                  -> Index Scan using libeindex_pkey on libeindex
                                      (cost=0.00..1.27 rows=1 width=4652)
                                      (actual time=0.009..0.009 rows=0 loops=1)
                                        Index Cond: ((classname)::text = ’article’::text)
                                  -> Seq Scan on libedefault libeindex
                                      (cost=0.00..39180.01 rows=598285 width=1495)
                                      (actual time=0.048..1373.449 rows=583675 loops=1)
                                        Filter: ((classname)::text = ’article’::text)
  Total runtime: 6161.217 ms




                Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Exemple de requête (fin)



  Le query plan idéal
  Limit  (cost=0.00..299.07 rows=12 width=528)
         (actual time=29.687..36.074 rows=20 loops=1)
    -> Subquery Scan subquery (cost=0.00..299.07 rows=12 width=528)
                                (actual time=29.684..36.037 rows=20 loops=1)
          Filter: (subquery.fulltext_tsv @@ ’’’gauche’’’::tsquery)
          -> Limit (cost=0.00..267.82 rows=2500 width=1495)
                     (actual time=29.106..33.643 rows=203 loops=1)
                -> Index Scan Backward using libedefault_createdat_index on libedefault
                    (cost=0.00..64092.05 rows=598285 width=1495)
                    (actual time=29.103..33.280 rows=203 loops=1)
                      Filter: ((classname)::text = ’article’::text)
  Total runtime: 36.156 ms




               Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Gestion des partitions dans SeSQL

  Contournement
      SeSQL va analyser la requête.
      Il effectue les requêtes sur les sous-tables directement, et
      fusionne.
      Uniquement en short query car inutile en long query.

  Nouvelles partitions
      Partitions séparées pour tous les éléments « non
      éditorial ».
      Tous les éléments éditoriaux dans une table.
      Au total : 9 tables.


             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Résultats finaux


  Résultats statistiques




             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Accès concurrents




         Accès concurrents




          Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Modalités de tests

  Contraintes
      Jusqu’à présent, tests séquentiels uniquement.
      Dans la réalité, il y a des requêtes simultanées, en lecture
      comme en écriture (mise à jour, indexation de nouveaux
      éléments).
      Problème : nous n’avons pas de logs exacts en ce qui
      concerne l’écriture.

  Tests réalisés
      Effectuer des requêtes depuis plusieurs threads.
      Chaque thread effectue des requêtes d’un seul type
      (recherche ou indexation), en continu.
      Variation du nombre de threads dédiés à chaque tâche.

             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Accès concurrents


  Résultats statistiques




             Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Conclusion




                      Conclusion




         Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Conclusion


  Situation actuelle
      Résultats très positifs des tests
      Déployé sur la pré-production
      En attente de déploiement sur la production

  Évolutions futures
      Utilisation sur le frontal
      Amélioration du cas « france 2 »
      Dépendances au niveau des colonnes




              Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
Le but secret...




       ... la migration de la base principale en PostgreSQL.




            Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
En attendant




  Remerciements
     Merci à la communauté PostgreSQL et à la communauté
     Python
     Merci à Libération de nous avoir fait confiance
     Merci à Jérôme Petazzoni qui a contribué à la conception




           Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération
En attendant

  La page de pub
      Pilot Systems, société de services en logiciels libres :
      http://www.pilotsystems.net
      Contactez-nous sur info@pilotsystems.net

  Les slides

      Licence CC-By-Sa
      http://contributions.pilotsystems.net/

                                    Des questions ?



               Gaël L E M IGNOT — Pilot Systems   Indexation d’une base documentaire pour le quotidien Libération

More Related Content

Viewers also liked

Moteurs de recherche et Lucene at LorraineJUG
Moteurs de recherche et Lucene at LorraineJUGMoteurs de recherche et Lucene at LorraineJUG
Moteurs de recherche et Lucene at LorraineJUGLucian Precup
 
Psm master1 - pre-requis seo - referencement naturel
Psm   master1 - pre-requis seo - referencement naturelPsm   master1 - pre-requis seo - referencement naturel
Psm master1 - pre-requis seo - referencement naturelJCD srcmontbeliard
 
Plateforme de gestion des projets de fin d'études
Plateforme de gestion des projets de fin d'étudesPlateforme de gestion des projets de fin d'études
Plateforme de gestion des projets de fin d'étudesMajdi SAIBI
 
Referencement : indexation et optimisation technique (SEO)
Referencement : indexation et optimisation technique (SEO)Referencement : indexation et optimisation technique (SEO)
Referencement : indexation et optimisation technique (SEO)JCD srcmontbeliard
 
Matej Ftacnik - The Spot - Slovakia - Stanford Engineering - Feb 23 2015
Matej Ftacnik - The Spot - Slovakia - Stanford Engineering - Feb 23 2015Matej Ftacnik - The Spot - Slovakia - Stanford Engineering - Feb 23 2015
Matej Ftacnik - The Spot - Slovakia - Stanford Engineering - Feb 23 2015Burton Lee
 
Rapport de projet de fin d'étude licence informatique et multimédia
Rapport de projet de fin d'étude licence informatique et multimédiaRapport de projet de fin d'étude licence informatique et multimédia
Rapport de projet de fin d'étude licence informatique et multimédiaNazih Heni
 
Introduction à la Recherche d'information
Introduction à la Recherche d'informationIntroduction à la Recherche d'information
Introduction à la Recherche d'informationSaïd Radhouani
 

Viewers also liked (8)

Moteurs de recherche et Lucene at LorraineJUG
Moteurs de recherche et Lucene at LorraineJUGMoteurs de recherche et Lucene at LorraineJUG
Moteurs de recherche et Lucene at LorraineJUG
 
L' Analyse documentaire : indexation, classification, clusters
L' Analyse documentaire : indexation, classification, clustersL' Analyse documentaire : indexation, classification, clusters
L' Analyse documentaire : indexation, classification, clusters
 
Psm master1 - pre-requis seo - referencement naturel
Psm   master1 - pre-requis seo - referencement naturelPsm   master1 - pre-requis seo - referencement naturel
Psm master1 - pre-requis seo - referencement naturel
 
Plateforme de gestion des projets de fin d'études
Plateforme de gestion des projets de fin d'étudesPlateforme de gestion des projets de fin d'études
Plateforme de gestion des projets de fin d'études
 
Referencement : indexation et optimisation technique (SEO)
Referencement : indexation et optimisation technique (SEO)Referencement : indexation et optimisation technique (SEO)
Referencement : indexation et optimisation technique (SEO)
 
Matej Ftacnik - The Spot - Slovakia - Stanford Engineering - Feb 23 2015
Matej Ftacnik - The Spot - Slovakia - Stanford Engineering - Feb 23 2015Matej Ftacnik - The Spot - Slovakia - Stanford Engineering - Feb 23 2015
Matej Ftacnik - The Spot - Slovakia - Stanford Engineering - Feb 23 2015
 
Rapport de projet de fin d'étude licence informatique et multimédia
Rapport de projet de fin d'étude licence informatique et multimédiaRapport de projet de fin d'étude licence informatique et multimédia
Rapport de projet de fin d'étude licence informatique et multimédia
 
Introduction à la Recherche d'information
Introduction à la Recherche d'informationIntroduction à la Recherche d'information
Introduction à la Recherche d'information
 

Similar to Indexation d'une base documentaire pour Liberation

SeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQLSeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQLParis, France
 
Conférence Sesql - DjangoCong 2011
Conférence Sesql - DjangoCong 2011Conférence Sesql - DjangoCong 2011
Conférence Sesql - DjangoCong 2011Paris, France
 
Analyse et optimisation des performances du moteur SQL Serveur
Analyse et optimisation des performances du moteur SQL ServeurAnalyse et optimisation des performances du moteur SQL Serveur
Analyse et optimisation des performances du moteur SQL ServeurMicrosoft Technet France
 
SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015Rodolphe Quiédeville
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8lyonjug
 
PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009Oslandia
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...ECAM Brussels Engineering School
 
Elastic Morocco user group meetup June
Elastic Morocco user group meetup JuneElastic Morocco user group meetup June
Elastic Morocco user group meetup JuneAnna Ossowski
 
De 20 000 à 4 millions d'utilisateurs : mode d'emploi
De 20 000 à 4 millions d'utilisateurs : mode d'emploiDe 20 000 à 4 millions d'utilisateurs : mode d'emploi
De 20 000 à 4 millions d'utilisateurs : mode d'emploiKhanh Maudoux
 
Développement de plug in sous eclipse
Développement de plug in sous eclipseDéveloppement de plug in sous eclipse
Développement de plug in sous eclipseISIG
 
ASP.NET Futures
ASP.NET FuturesASP.NET Futures
ASP.NET Futuresloicbar
 
Asp.Net Futures
Asp.Net FuturesAsp.Net Futures
Asp.Net Futuresloicbar
 
Réussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDBRéussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDB MongoDB
 
Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Luc Desruelle
 
Les micro orm, alternatives à entity framework
Les micro orm, alternatives à entity frameworkLes micro orm, alternatives à entity framework
Les micro orm, alternatives à entity frameworkMSDEVMTL
 
Proposition d'interface pour GreenFox - 3 août 2010
Proposition d'interface pour GreenFox - 3 août 2010Proposition d'interface pour GreenFox - 3 août 2010
Proposition d'interface pour GreenFox - 3 août 2010David Bourguignon
 
Déploiement ELK en conditions réelles
Déploiement ELK en conditions réellesDéploiement ELK en conditions réelles
Déploiement ELK en conditions réellesGeoffroy Arnoud
 
Azure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaAzure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaMicrosoft
 

Similar to Indexation d'une base documentaire pour Liberation (20)

SeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQLSeSQL : un moteur de recherche en Python et PostgreSQL
SeSQL : un moteur de recherche en Python et PostgreSQL
 
Conférence Sesql - DjangoCong 2011
Conférence Sesql - DjangoCong 2011Conférence Sesql - DjangoCong 2011
Conférence Sesql - DjangoCong 2011
 
Analyse et optimisation des performances du moteur SQL Serveur
Analyse et optimisation des performances du moteur SQL ServeurAnalyse et optimisation des performances du moteur SQL Serveur
Analyse et optimisation des performances du moteur SQL Serveur
 
SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015SQL Debug avec Django @ PyConFr 2015
SQL Debug avec Django @ PyConFr 2015
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8
 
PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009
 
Pytong2015
Pytong2015Pytong2015
Pytong2015
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...
 
Elastic Morocco user group meetup June
Elastic Morocco user group meetup JuneElastic Morocco user group meetup June
Elastic Morocco user group meetup June
 
De 20 000 à 4 millions d'utilisateurs : mode d'emploi
De 20 000 à 4 millions d'utilisateurs : mode d'emploiDe 20 000 à 4 millions d'utilisateurs : mode d'emploi
De 20 000 à 4 millions d'utilisateurs : mode d'emploi
 
Développement de plug in sous eclipse
Développement de plug in sous eclipseDéveloppement de plug in sous eclipse
Développement de plug in sous eclipse
 
ASP.NET Futures
ASP.NET FuturesASP.NET Futures
ASP.NET Futures
 
Asp.Net Futures
Asp.Net FuturesAsp.Net Futures
Asp.Net Futures
 
Réussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDBRéussir une montée en charge avec MongoDB
Réussir une montée en charge avec MongoDB
 
Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...
 
Les micro orm, alternatives à entity framework
Les micro orm, alternatives à entity frameworkLes micro orm, alternatives à entity framework
Les micro orm, alternatives à entity framework
 
graylog.pptx
graylog.pptxgraylog.pptx
graylog.pptx
 
Proposition d'interface pour GreenFox - 3 août 2010
Proposition d'interface pour GreenFox - 3 août 2010Proposition d'interface pour GreenFox - 3 août 2010
Proposition d'interface pour GreenFox - 3 août 2010
 
Déploiement ELK en conditions réelles
Déploiement ELK en conditions réellesDéploiement ELK en conditions réelles
Déploiement ELK en conditions réelles
 
Azure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaAzure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmedia
 

More from Paris, France

Transformation digitale
Transformation digitaleTransformation digitale
Transformation digitaleParis, France
 
Django Hacking : Comment dresser les serpents guitaristes
Django Hacking : Comment dresser les serpents guitaristesDjango Hacking : Comment dresser les serpents guitaristes
Django Hacking : Comment dresser les serpents guitaristesParis, France
 
Neopod: une base de données objet distribuée
Neopod: une base de données objet distribuéeNeopod: une base de données objet distribuée
Neopod: une base de données objet distribuéeParis, France
 
API Cockpit : faites communiquer vos applications web
API Cockpit : faites communiquer vos applications webAPI Cockpit : faites communiquer vos applications web
API Cockpit : faites communiquer vos applications webParis, France
 
Systematic/NEOPPOD dévoilent la première base de données objets NoSQL Open So...
Systematic/NEOPPOD dévoilent la première base de données objets NoSQL Open So...Systematic/NEOPPOD dévoilent la première base de données objets NoSQL Open So...
Systematic/NEOPPOD dévoilent la première base de données objets NoSQL Open So...Paris, France
 
Plone Conference 2008 Lightning Talk Static Zope Rpx
Plone Conference 2008 Lightning Talk Static Zope RpxPlone Conference 2008 Lightning Talk Static Zope Rpx
Plone Conference 2008 Lightning Talk Static Zope RpxParis, France
 
Neoppod, discloses first open source transactional NoSQL Object database for ...
Neoppod, discloses first open source transactional NoSQL Object database for ...Neoppod, discloses first open source transactional NoSQL Object database for ...
Neoppod, discloses first open source transactional NoSQL Object database for ...Paris, France
 
Cockpit, gestion de contacts et d'emailing
Cockpit, gestion de contacts et d'emailingCockpit, gestion de contacts et d'emailing
Cockpit, gestion de contacts et d'emailingParis, France
 
Plone, du site web à la gestion documentaire
Plone, du site web à la gestion documentairePlone, du site web à la gestion documentaire
Plone, du site web à la gestion documentaireParis, France
 
Les critères de choix d'un intranet
Les critères de choix d'un intranetLes critères de choix d'un intranet
Les critères de choix d'un intranetParis, France
 
Virtualisation Cloud Computing Saas Open Source
Virtualisation Cloud Computing Saas Open SourceVirtualisation Cloud Computing Saas Open Source
Virtualisation Cloud Computing Saas Open SourceParis, France
 
Partenariat Exo Platform/Pilot Systems
Partenariat Exo Platform/Pilot SystemsPartenariat Exo Platform/Pilot Systems
Partenariat Exo Platform/Pilot SystemsParis, France
 
Open World Forum 2009 Synthesis
Open World Forum 2009 SynthesisOpen World Forum 2009 Synthesis
Open World Forum 2009 SynthesisParis, France
 
Open World Forum 2009 Presentation
Open World Forum 2009 PresentationOpen World Forum 2009 Presentation
Open World Forum 2009 PresentationParis, France
 
Deliverance, la puissance de la gestion de contenu Plone appliquee aux themes...
Deliverance, la puissance de la gestion de contenu Plone appliquee aux themes...Deliverance, la puissance de la gestion de contenu Plone appliquee aux themes...
Deliverance, la puissance de la gestion de contenu Plone appliquee aux themes...Paris, France
 
Deploiement de Plone et Deliverance avec Ubuntu VM Builder
Deploiement de Plone et Deliverance avec Ubuntu VM BuilderDeploiement de Plone et Deliverance avec Ubuntu VM Builder
Deploiement de Plone et Deliverance avec Ubuntu VM BuilderParis, France
 
Deliverance, la puissance de la gestion de contenu Plone appliquée aux thèmes...
Deliverance, la puissance de la gestion de contenu Plone appliquée aux thèmes...Deliverance, la puissance de la gestion de contenu Plone appliquée aux thèmes...
Deliverance, la puissance de la gestion de contenu Plone appliquée aux thèmes...Paris, France
 
Construire un module enfichable (pluggable) et dynamique pour Plone
Construire un module enfichable (pluggable) et dynamique pour PloneConstruire un module enfichable (pluggable) et dynamique pour Plone
Construire un module enfichable (pluggable) et dynamique pour PloneParis, France
 
La virtualisation dans le Datacenter
La virtualisation dans le DatacenterLa virtualisation dans le Datacenter
La virtualisation dans le DatacenterParis, France
 
Guide pratique des logiciels libres dans les administrations
Guide pratique des logiciels libres dans les administrationsGuide pratique des logiciels libres dans les administrations
Guide pratique des logiciels libres dans les administrationsParis, France
 

More from Paris, France (20)

Transformation digitale
Transformation digitaleTransformation digitale
Transformation digitale
 
Django Hacking : Comment dresser les serpents guitaristes
Django Hacking : Comment dresser les serpents guitaristesDjango Hacking : Comment dresser les serpents guitaristes
Django Hacking : Comment dresser les serpents guitaristes
 
Neopod: une base de données objet distribuée
Neopod: une base de données objet distribuéeNeopod: une base de données objet distribuée
Neopod: une base de données objet distribuée
 
API Cockpit : faites communiquer vos applications web
API Cockpit : faites communiquer vos applications webAPI Cockpit : faites communiquer vos applications web
API Cockpit : faites communiquer vos applications web
 
Systematic/NEOPPOD dévoilent la première base de données objets NoSQL Open So...
Systematic/NEOPPOD dévoilent la première base de données objets NoSQL Open So...Systematic/NEOPPOD dévoilent la première base de données objets NoSQL Open So...
Systematic/NEOPPOD dévoilent la première base de données objets NoSQL Open So...
 
Plone Conference 2008 Lightning Talk Static Zope Rpx
Plone Conference 2008 Lightning Talk Static Zope RpxPlone Conference 2008 Lightning Talk Static Zope Rpx
Plone Conference 2008 Lightning Talk Static Zope Rpx
 
Neoppod, discloses first open source transactional NoSQL Object database for ...
Neoppod, discloses first open source transactional NoSQL Object database for ...Neoppod, discloses first open source transactional NoSQL Object database for ...
Neoppod, discloses first open source transactional NoSQL Object database for ...
 
Cockpit, gestion de contacts et d'emailing
Cockpit, gestion de contacts et d'emailingCockpit, gestion de contacts et d'emailing
Cockpit, gestion de contacts et d'emailing
 
Plone, du site web à la gestion documentaire
Plone, du site web à la gestion documentairePlone, du site web à la gestion documentaire
Plone, du site web à la gestion documentaire
 
Les critères de choix d'un intranet
Les critères de choix d'un intranetLes critères de choix d'un intranet
Les critères de choix d'un intranet
 
Virtualisation Cloud Computing Saas Open Source
Virtualisation Cloud Computing Saas Open SourceVirtualisation Cloud Computing Saas Open Source
Virtualisation Cloud Computing Saas Open Source
 
Partenariat Exo Platform/Pilot Systems
Partenariat Exo Platform/Pilot SystemsPartenariat Exo Platform/Pilot Systems
Partenariat Exo Platform/Pilot Systems
 
Open World Forum 2009 Synthesis
Open World Forum 2009 SynthesisOpen World Forum 2009 Synthesis
Open World Forum 2009 Synthesis
 
Open World Forum 2009 Presentation
Open World Forum 2009 PresentationOpen World Forum 2009 Presentation
Open World Forum 2009 Presentation
 
Deliverance, la puissance de la gestion de contenu Plone appliquee aux themes...
Deliverance, la puissance de la gestion de contenu Plone appliquee aux themes...Deliverance, la puissance de la gestion de contenu Plone appliquee aux themes...
Deliverance, la puissance de la gestion de contenu Plone appliquee aux themes...
 
Deploiement de Plone et Deliverance avec Ubuntu VM Builder
Deploiement de Plone et Deliverance avec Ubuntu VM BuilderDeploiement de Plone et Deliverance avec Ubuntu VM Builder
Deploiement de Plone et Deliverance avec Ubuntu VM Builder
 
Deliverance, la puissance de la gestion de contenu Plone appliquée aux thèmes...
Deliverance, la puissance de la gestion de contenu Plone appliquée aux thèmes...Deliverance, la puissance de la gestion de contenu Plone appliquée aux thèmes...
Deliverance, la puissance de la gestion de contenu Plone appliquée aux thèmes...
 
Construire un module enfichable (pluggable) et dynamique pour Plone
Construire un module enfichable (pluggable) et dynamique pour PloneConstruire un module enfichable (pluggable) et dynamique pour Plone
Construire un module enfichable (pluggable) et dynamique pour Plone
 
La virtualisation dans le Datacenter
La virtualisation dans le DatacenterLa virtualisation dans le Datacenter
La virtualisation dans le Datacenter
 
Guide pratique des logiciels libres dans les administrations
Guide pratique des logiciels libres dans les administrationsGuide pratique des logiciels libres dans les administrations
Guide pratique des logiciels libres dans les administrations
 

Indexation d'une base documentaire pour Liberation

  • 1. Indexation d’une base documentaire pour le quotidien Libération Gaël L E M IGNOT — Pilot Systems 25 juin 2010 Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 2. Plan 1 Introduction 2 Architecture Architecture actuelle Nouvelle architecture Premières expériences 3 Nécessité d’une heuristique Analyse des résultats Définition de l’heuristique Finitions 4 Contributions et partitions Ajout des contributions Utilisation des partitions 5 Accès concurrents 6 Conclusion Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 3. Contexte Contexte général Quotidien Libération Utilisation en back-office dans un premier temps Utilisation en frontal prévue pour l’avenir Utilisation de la recherche Navigation Recherches simples Recherches documentaires Solution actuelle Propriétaire, sous Windows (TextML) Problèmes de performances et de stabilité Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 4. Base d’indexation Volumétrie 583 675 articles 140 870 pages 1 134 382 contributions (non indexées dans TextML) 104 595 contenus divers Types d’index Recherche en texte plein Recherche sur texte exact Filtres sur des méta-données : auteurs, catégories, . . . Tri par date Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 5. Interface de recherche Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 6. Architecture Architecture Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 7. Schéma de l’architecture actuelle Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 8. Schéma de la nouvelle architecture Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 9. Points clés de la nouvelle architecture Avantages directement recherchés Performances et stabilité Possibilité d’indexer les contributions Possibilité d’aller vers l’utilisation en frontal Contrôle plus fin du comportement Avantages connexes Gestion des dépendances (entre auteurs et articles par exemple) Ré-indexation massive facilitée Ré-indexation partielle possible Plus grande liberté de recherche Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 10. Première approche Structure de la base Une seule table, libeindex classname et id comme clé primaire Nombreuses colonnes, dont des champs en tsvector Matériel et logiciel Machine virtuelle sous Xen Debian 5.0 PostgreSQL 8.3 Deux cœurs dédiés à la machine virtuelle Mémoire variant de 4Go à 12Go suivant les tests Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 11. Premiers résultats Modalités de mesure Log des requêtes effectuées en production Deux périodes : 10 au 19 juin, et 1er juillet au 19 août Envoi séquentiel dans n threads, par défaut 1 Résultats statistiques sur la première version Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 12. Exemple de requête La requête SELECT classname, id, modifiedAt FROM libeindex WHERE fulltext_tsv @@ plainto_tsquery(’public.simple_french’, ’gauche’) ORDER BY modifiedAt DESC LIMIT 20; Le query plan Limit (cost=3.03..3.03 rows=3 width=19) (actual time=25657.959..25658.011 rows=20 loops=1) -> Sort (cost=3.03..3.03 rows=3 width=19) (actual time=25657.955..25657.971 rows=20 loops=1) Sort Key: modifiedat Sort Method: top-N heapsort Memory: 26kB -> Bitmap Heap Scan on libeindex (cost=1.47..3.00 rows=3 width=19) (actual time=559.153..25568.663 rows=46328 loops=1) Recheck Cond: (fulltext_tsv @@ ’’’gauche’’’::tsquery) -> Bitmap Index Scan on libeindex_fulltext_index (cost=0.00..1.47 rows=3 width=0) (actual time=548.904..548.904 rows=46328 loops=1) Index Cond: (fulltext_tsv @@ ’’’gauche’’’::tsquery) Total runtime: 25658.085 ms Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 13. Nécessité d’une heuristique Nécessité d’une heuristique Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 14. Émergence de l’idée Constatations Les requêtes sont lentes quand les termes recherchés sont très fréquents. Cependant, seules certaines de ces requêtes sont lentes. La plupart des requêtes demandent les 20, 50 ou 100 éléments les plus récents. Conclusion PostgreSQL se trompe donc parfois de query plan. Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 15. Explication : terme rare Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 16. Explication : terme fréquent Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 17. Optimisation manuelle de la requête La requête SELECT classname, id, modifiedAt FROM (SELECT * FROM libeindex ORDER BY modifiedAt DESC LIMIT 2500) subquery WHERE fulltext_tsv @@ plainto_tsquery(’public.simple_french’, ’gauche’) ORDER BY modifiedAt DESC LIMIT 20; Le query plan Limit (cost=0.00..1100.22 rows=12 width=528) (actual time=150.467..651.747 rows=20 loops=1) -> Subquery Scan subquery (cost=0.00..1100.22 rows=12 width=528) (actual time=150.464..651.701 rows=20 loops=1) Filter: (subquery.fulltext_tsv @@ ’’’gauche’’’::tsquery) -> Limit (cost=0.00..1068.97 rows=2500 width=1418) (actual time=29.239..288.642 rows=426 loops=1) -> Index Scan Backward using libeindex_modifiedat_index on libeindex (cost=0.00..359616.93 rows=841035 width=1418) (actual time=29.237..287.880 rows=426 loops=1) Total runtime: 651.841 ms Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 18. Fonctionnement de l’heuristique Principe de l’heuristique On commence par faire une subquery sur les éléments récents uniquement. Plan A : recherche sur un petit nombre d’éléments récents. Plan B : comme le plan A, mais sur plus d’éléments. Plan C : recherche classique, sans subquery. Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 19. Algorithme Légende INITIAL = 2500, THRESOLD = 0.35, MARGIN = 3.0 found ratio = wanted Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 20. Résultats Résultats statistiques Analyse des résultats Résultats globalement très satisfaisant. Requête la plus lente : « france 2 » Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 21. Améliorations mineures Listes des améliorations mineures Index croisés sur classname et les champs dates. Paramétrage de l’heuristique. PostgreSQL 8.4, avec un statistics à 10 000. Résultats statistiques Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 22. Requêtes courtes et longues Limitations imposées par l’heuristique Pas de décompte du nombre de résultats. Pas de pagination possible. Solution Définition de deux méthodes dans SeSQL. Short queries pour la navigation ou les recherches simples. Long queries pour les recherches documentaires, plus spécifiques. Amélioration possible : faire une short query pour afficher la première page, et en tâche fond effectuer la long query. Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 23. Contributions et partitions Contributions et partitions Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 24. Ajout brutal Expérience Ajout des contributions dans la base, sans autre modification. Les requêtes ne portent pas sur les contributions. Résultats statistiques Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 25. Partitions PostgreSQL Description Objectif : séparer les contributions des autres contenus. Utilisation de l’héritage de tables. Utilisation des contraintes sur les sous-tables. Résultats Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 26. Exemple de requête La requête SELECT classname, id, createdAt FROM (SELECT * FROM libeindex WHERE (classname=’article’) ORDER BY createdAt DESC LIMIT 2500) subquery WHERE fulltext_tsv @@ plainto_tsquery(’public.simple_french’, ’gauche’) ORDER BY createdAt DESC LIMIT 20; Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 27. Exemple de requête (suite) Le query plan Limit (cost=75939.11..75976.61 rows=12 width=528) (actual time=6158.547..6161.066 rows=20 loops=1) -> Subquery Scan subquery (cost=75939.11..75976.61 rows=12 width=528) (actual time=6158.544..6161.027 rows=20 loops=1) Filter: (subquery.fulltext_tsv @@ ’’’gauche’’’::tsquery) -> Limit (cost=75939.11..75945.36 rows=2500 width=1495) (actual time=6158.128..6158.700 rows=203 loops=1) -> Sort (cost=75939.11..77434.83 rows=598286 width=1495) (actual time=6158.125..6158.331 rows=203 loops=1) Sort Key: public.libeindex.createdat Sort Method: top-N heapsort Memory: 3634kB -> Result (cost=0.00..39181.28 rows=598286 width=1495) (actual time=0.064..3878.206 rows=583675 loops=1) -> Append (cost=0.00..39181.28 rows=598286 width=1495) (actual time=0.060..2360.568 rows=583675 loops=1) -> Index Scan using libeindex_pkey on libeindex (cost=0.00..1.27 rows=1 width=4652) (actual time=0.009..0.009 rows=0 loops=1) Index Cond: ((classname)::text = ’article’::text) -> Seq Scan on libedefault libeindex (cost=0.00..39180.01 rows=598285 width=1495) (actual time=0.048..1373.449 rows=583675 loops=1) Filter: ((classname)::text = ’article’::text) Total runtime: 6161.217 ms Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 28. Exemple de requête (fin) Le query plan idéal Limit (cost=0.00..299.07 rows=12 width=528) (actual time=29.687..36.074 rows=20 loops=1) -> Subquery Scan subquery (cost=0.00..299.07 rows=12 width=528) (actual time=29.684..36.037 rows=20 loops=1) Filter: (subquery.fulltext_tsv @@ ’’’gauche’’’::tsquery) -> Limit (cost=0.00..267.82 rows=2500 width=1495) (actual time=29.106..33.643 rows=203 loops=1) -> Index Scan Backward using libedefault_createdat_index on libedefault (cost=0.00..64092.05 rows=598285 width=1495) (actual time=29.103..33.280 rows=203 loops=1) Filter: ((classname)::text = ’article’::text) Total runtime: 36.156 ms Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 29. Gestion des partitions dans SeSQL Contournement SeSQL va analyser la requête. Il effectue les requêtes sur les sous-tables directement, et fusionne. Uniquement en short query car inutile en long query. Nouvelles partitions Partitions séparées pour tous les éléments « non éditorial ». Tous les éléments éditoriaux dans une table. Au total : 9 tables. Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 30. Résultats finaux Résultats statistiques Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 31. Accès concurrents Accès concurrents Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 32. Modalités de tests Contraintes Jusqu’à présent, tests séquentiels uniquement. Dans la réalité, il y a des requêtes simultanées, en lecture comme en écriture (mise à jour, indexation de nouveaux éléments). Problème : nous n’avons pas de logs exacts en ce qui concerne l’écriture. Tests réalisés Effectuer des requêtes depuis plusieurs threads. Chaque thread effectue des requêtes d’un seul type (recherche ou indexation), en continu. Variation du nombre de threads dédiés à chaque tâche. Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 33. Accès concurrents Résultats statistiques Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 34. Conclusion Conclusion Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 35. Conclusion Situation actuelle Résultats très positifs des tests Déployé sur la pré-production En attente de déploiement sur la production Évolutions futures Utilisation sur le frontal Amélioration du cas « france 2 » Dépendances au niveau des colonnes Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 36. Le but secret... ... la migration de la base principale en PostgreSQL. Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 37. En attendant Remerciements Merci à la communauté PostgreSQL et à la communauté Python Merci à Libération de nous avoir fait confiance Merci à Jérôme Petazzoni qui a contribué à la conception Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
  • 38. En attendant La page de pub Pilot Systems, société de services en logiciels libres : http://www.pilotsystems.net Contactez-nous sur info@pilotsystems.net Les slides Licence CC-By-Sa http://contributions.pilotsystems.net/ Des questions ? Gaël L E M IGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération