Upload
paris-france
View
1.078
Download
1
Embed Size (px)
DESCRIPTION
Présentation des évolutions envisagées pour le moteur de recherche du quotidien Libération. Le back-office de Libération repose sur un moteur d'indexation, intensément utilisé pour la navigation et la recherche. Le moteur actuel, propriétaire, a atteint ses limites en termes de performances et de stabilité. Pilot Systems a donc développé un nouveau moteur, basé sur PostgreSQL. La grande volumétrie (500 000 articles, plus d'un million de contributions), l'utilisation massive de full text search et les contraintes de performances nous ont conduit à utiliser quelques heuristiques.
Citation preview
Indexation d’une base documentaire pour lequotidien Libération
Gaël LE MIGNOT — Pilot Systems
25 juin 2010
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Plan
1 Introduction2 Architecture
Architecture actuelleNouvelle architecturePremières expériences
3 Nécessité d’une heuristiqueAnalyse des résultatsDéfinition de l’heuristiqueFinitions
4 Contributions et partitionsAjout des contributionsUtilisation des partitions
5 Accès concurrents6 Conclusion
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Contexte
Contexte général
Quotidien LibérationUtilisation en back-office dans un premier tempsUtilisation en frontal prévue pour l’avenir
Utilisation de la rechercheNavigationRecherches simplesRecherches documentaires
Solution actuellePropriétaire, sous Windows (TextML)Problèmes de performances et de stabilité
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Base d’indexation
Volumétrie583 675 articles140 870 pages1 134 382 contributions (non indexées dans TextML)104 595 contenus divers
Types d’indexRecherche en texte pleinRecherche sur texte exactFiltres sur des méta-données : auteurs, catégories, . . .Tri par date
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Interface de recherche
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Architecture
Architecture
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Schéma de l’architecture actuelle
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Schéma de la nouvelle architecture
Gaël LE MIGNOT — 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 contributionsPossibilité d’aller vers l’utilisation en frontalContrôle plus fin du comportement
Avantages connexes
Gestion des dépendances(entre auteurs et articles par exemple)Ré-indexation massive facilitéeRé-indexation partielle possiblePlus grande liberté de recherche
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Première approche
Structure de la baseUne seule table, libeindexclassname et id comme clé primaireNombreuses colonnes, dont des champs en tsvector
Matériel et logicielMachine virtuelle sous XenDebian 5.0PostgreSQL 8.3Deux cœurs dédiés à la machine virtuelleMémoire variant de 4Go à 12Go suivant les tests
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Premiers résultats
Modalités de mesureLog des requêtes effectuées en productionDeux périodes : 10 au 19 juin, et 1er juillet au 19 aoûtEnvoi séquentiel dans n threads, par défaut 1
Résultats statistiques sur la première version
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Exemple de requête
La requêteSELECT classname, id, modifiedAtFROM libeindexWHERE fulltext_tsv @@ plainto_tsquery(’public.simple_french’, ’gauche’)ORDER BY modifiedAt DESC LIMIT 20;
Le query planLimit (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: modifiedatSort 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 LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Nécessité d’une heuristique
Nécessité d’une heuristique
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Émergence de l’idée
ConstatationsLes requêtes sont lentes quand les termes recherchéssont 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.
ConclusionPostgreSQL se trompe donc parfois de query plan.
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Explication : terme rare
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Explication : terme fréquent
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Optimisation manuelle de la requête
La requêteSELECT classname, id, modifiedAtFROM (SELECT * FROM libeindex ORDER BY modifiedAt DESC LIMIT 2500) subqueryWHERE fulltext_tsv @@ plainto_tsquery(’public.simple_french’, ’gauche’)ORDER BY modifiedAt DESC LIMIT 20;
Le query planLimit (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 LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Fonctionnement de l’heuristique
Principe de l’heuristiqueOn commence par faire une subquery sur les élémentsré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 LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Algorithme
Légende
INITIAL = 2500,THRESOLD = 0.35,MARGIN = 3.0ratio = found
wanted
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Résultats
Résultats statistiques
Analyse des résultatsRésultats globalement très satisfaisant.Requête la plus lente : « france 2 »
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Améliorations mineures
Listes des améliorations mineuresIndex 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 LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Requêtes courtes et longues
Limitations imposées par l’heuristiquePas de décompte du nombre de résultats.Pas de pagination possible.
SolutionDéfinition de deux méthodes dans SeSQL.Short queries pour la navigation ou les recherchessimples.Long queries pour les recherches documentaires, plusspécifiques.Amélioration possible : faire une short query pour afficherla première page, et en tâche fond effectuer la long query.
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Contributions et partitions
Contributions et partitions
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Ajout brutal
ExpérienceAjout des contributions dans la base, sans autremodification.Les requêtes ne portent pas sur les contributions.
Résultats statistiques
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Partitions PostgreSQL
DescriptionObjectif : 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 LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Exemple de requête
La requêteSELECT classname, id, createdAtFROM (SELECT * FROM libeindex WHERE (classname=’article’)
ORDER BY createdAt DESC LIMIT 2500) subqueryWHERE fulltext_tsv @@ plainto_tsquery(’public.simple_french’, ’gauche’)ORDER BY createdAt DESC LIMIT 20;
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Exemple de requête (suite)
Le query planLimit (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.createdatSort 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 LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Exemple de requête (fin)
Le query plan idéalLimit (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 LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Gestion des partitions dans SeSQL
ContournementSeSQL va analyser la requête.Il effectue les requêtes sur les sous-tables directement, etfusionne.Uniquement en short query car inutile en long query.
Nouvelles partitionsPartitions séparées pour tous les éléments « nonéditorial ».Tous les éléments éditoriaux dans une table.Au total : 9 tables.
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Résultats finaux
Résultats statistiques
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Accès concurrents
Accès concurrents
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Modalités de tests
ContraintesJusqu’à présent, tests séquentiels uniquement.Dans la réalité, il y a des requêtes simultanées, en lecturecomme en écriture (mise à jour, indexation de nouveauxéléments).Problème : nous n’avons pas de logs exacts en ce quiconcerne l’écriture.
Tests réalisésEffectuer 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 LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Accès concurrents
Résultats statistiques
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Conclusion
Conclusion
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
Conclusion
Situation actuelleRésultats très positifs des testsDéployé sur la pré-productionEn attente de déploiement sur la production
Évolutions futuresUtilisation sur le frontalAmélioration du cas « france 2 »
Dépendances au niveau des colonnes
Gaël LE MIGNOT — 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 LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération
En attendant
RemerciementsMerci à la communauté PostgreSQL et à la communautéPythonMerci à Libération de nous avoir fait confianceMerci à Jérôme Petazzoni qui a contribué à la conception
Gaël LE MIGNOT — 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 [email protected]
Les slides
Licence CC-By-Sahttp://contributions.pilotsystems.net/
Des questions ?
Gaël LE MIGNOT — Pilot Systems Indexation d’une base documentaire pour le quotidien Libération