SlideShare une entreprise Scribd logo
1  sur  38
Télécharger pour lire hors ligne
SeSQL : un moteur de recherche en Python et
               PostgreSQL

                   Yohann G ABORY — Gaël L E M IGNOT
                             Pilot Systems


                                      11 juillet 2011




Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Plan
  1      Introduction
            Le besoin initial
            L’historique du projet
  2      Fonctionnalités de SeSQL
            Indexation
            Recherche
            Fonctionnalités additionnelles
  3      Fonctionnement interne
            Gestion des dépendances
            Les short queries
            Quelques optimisations
            Benchmarks
  4      Perspectives pour l’avenir
            Nouvelles fonctionnalités
            Intégration à d’autres projets
  5      Conclusion
      Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Introduction




                              Introduction




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Contexte
  Contexte général
        Quotidien Libération
        Utilisation en back-office dans un premier temps
        Utilisation en frontal dans un second temps

  Utilisation de la recherche
        Navigation
        Recherches simples
        Recherches documentaires

  Solution précédente
        Propriétaire, sous Windows (TextML)
        Problèmes de performances et de stabilité
   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Solution précédante

  Schéma d’architecture




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Base d’indexation

  Volumétrie
      703 701 articles
        169 017 pages
        4 064 478 commentaires (non indexées dans TextML)
         100k 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


   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Interface de recherche




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Version initiale



  Contraintes
      Devait rester proche de l’architecture existante
        Devait s’interfacer avec du code PHP/MySQL

  Solution
      Un webservice en Python
        Une base PostgreSQL séparée
        Une API globalement compatible avec celle de TextML




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Première version de SeSQL


  Schéma d’architecture




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Deuxième version


  Contexte
      L’ensemble du site est en cours de migration en Django
        On souhaite s’épargner la lourdeur de l’API XML
        On souhaite rester aussi près que possible de Django

  Solution
      Une application Django
        Les recherches s’expriment avec l’objet Q de Django
        SeSQL renvoie des objets Django




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Deuxième version de SeSQL



  Schéma d’architecture




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Fonctionnalités de SeSQL




   Fonctionnalités de SeSQL




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Définition de l’indexation


  Types d’index
        Types simples : entiers, dates, ...
        Champs full text
        Champ multi-valués (pour des relations par exemple)

  Sources des index
      Champs du modèle
        Appel à des méthodes du modèle
        Suivi des relations
        Index composite : concaténation, premier non vide, ...



   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Intégration avec Django

  Configuration de SeSQL
        Une application comme une autre, qui doit être ajoutée
        dans le settings.py
        Nécessite un back-end PostgreSQL
        A son propre fichier de configuration, sesql_config.py

  Définition des modèles à indexer
     S’effectue via la TYPE_MAP dans la configuration
        Par défaut suit les héritages
        Permet de regrouper les contenus cherchés souvent
        ensembles
        SeSQL utilise un simple signal post_save

   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Un sesql_config minimaliste
FIELDS = (ClassField("classname"),
          LongIntField("id"),
          DateTimeField("created_at"),
          FullTextField("user","user.screen_name"),
          LongIntField("user_id", "user.id"),
          FullTextField("text",
        ["text"],
        primary=True,
        dictionnary = ’public.lem_french’,
                        ),
          )




 Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
un exemple d’intégration Rook : Recherche



  1 500 000 Tweets en full text
      Des requètes complexes :
        tweets = Tweet.objects.filter(
          user__relation__in = user.relation_set.filter(user_type = "followers")
        ).filter(text__icontains = mot).order_by(’-created_at’)


        Simplissime avec SeSQL :
        ids = request.user.relation_set.filter(user_type="friends").only(’id’)
        results = longquery(Q(user_id__in = ids)&
                            Q(text__containswords = request.GET[’search’] ))




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Gestion de la lexemisation

  Principe
        Prendre le radical des mots
        Peut être très compliqué : cheval, chevaux, chevalet
        Dépend de la langue
        Peut provoquer des effets de bord

  Dans SeSQL
     Utilise les text search configuration de PostgreSQL
        SeSQL effectue un nettoyage supplémentaire (accents,
        majuscules, entités HTML, ...)
        Peut être défini de manière différente par index


   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Description d’une recherche

  Utilisation de l’objet Q
        SeSQL utilise l’objet Q de Django
        Il permet de définir des recherches complexes, avec des
        ET, OU, négations, ...
        Chaque élément est composé de : un index, un opérateur
        et une valeur

  Les opérateurs
        Sur du texte : containswords, containsexact, ...
        Sur des tableaux : containsall, containsany, ...
        Opérateurs génériques : plus petit, plus grand, ...


   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Long query et short query


  Short query
        Requêtes pour de la navigation, un portlet, un aperçu, ...
        Limité à un petit nombre (par exemple 50) de résultats
        Ne supporte pas le tri par pertinence
        Extrêmement rapides

  Long query
        Supporte la pagination de manière stable
        Envoi le nombre exact de résultats
        Peut être plus lente dans certains cas



   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Quelques bonus

  Le tri
       Sur un index numérique ou de date
       Ou alors par pertinence, avec gestion :
               de la pondération (le titre compte plus que le corps du
               texte)
               de la proximité des mots cherchés
               de la fréquence des mots cherchés

  Les résultats
      SeSQLResultSet est un générateur Python, donc lazy
        Renvoi directement les objets Django à l’itération
        Les objets peuvent être de plusieurs types


   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Et en prime...

  Aide au highlight
        Un module spécial est fourni
        Il renvoi la liste des positions, en caractères, des mots
        ayant été trouvés

  SeSQL admin
     Permet d’utiliser SeSQL depuis l’admin Django
        Assez intrusif pour l’instant, donc désactivé par défaut

  Historique
        Collecte les historiques de recherche, en option
        Compte le nombre de résultats et la fréquence des
        recherches

   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Fonctionnement interne




        Fonctionnement interne




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Gestion des dépendances : le problème

  Un exemple
        Dans un module de Quizz, on veut indexer les réponses
        possibles dans l’objet Quizz
        Facile à faire avec SeSQL et les index composites
        Mais si on modifie une réponse, on ne modifie pas l’objet
        Quizz

  Les conséquences
        On veut pouvoir réindexer les objets liés quand on
        réindexe un objet
        Mais il peut y en avoir énormément : imaginons qu’on
        change le nom d’un auteur de 147 789 articles du journal !


   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Gestion des dépendances : la solution

  Le principe
        SeSQL stocke la liste des objets à ré-indexer
        Un daemon autonome s’occupe de les ré-indexer, petit à
        petit

  En pratique
        SeSQL ne détecte pas tout seul les objets liés
        Les modèles peuvent implémenter une méthode
        spécifique, qui indique à SeSQL ce qui doit être réindexé
        Cette méthode peut renvoyer des objets ou des couples
        (class, id).


   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Les short queries : le problème

  Rappel du contexte
        Trouver les 50 articles les plus récentes sur un sujet
        Doit être le plus rapide possible

  Les deux query plans
   1    Parcourir l’index sur les dates, et filtrer les articles
   2    Utiliser l’index sur les articles, puis trier sur les dates

  La limite de PostgreSQL
        PostgreSQL a des statistiques sur les mots
        Mais un mot peut être avoir été fréquent mais ne plus l’être


   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Exemple de plan 1




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Exemple de plan 2




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
L’heuristique


  L’algorithme




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Recherche par texte exact

  Problème
      PostgreSQL n’a pas d’index supportant ça
        Faire un LIKE sur toute la base est bien trop lent

  La solution
      On commence pas filtrer, via l’index, en texte approché
        Puis on refiltre avec un LIKE sur ce qui matché

  La cas France 2
      Beaucoup d’article contiennent les deux mots
        Mais peu le texte exact


   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Les partitions


  Problème
      On veut indexer du contenu très massif (les commentaires)
        On ne veut pas impacter les performances du reste

  La solution
      PostgreSQL supporte l’héritage de tables
        On indexe les commentaires dans une table à part
        On ne cherche que dans une sous-table, si possible
        Si non, on cherche dans la table maîtresse




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
There are three kinds of lies ...




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
... lies, damn lies and benchmarks




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Perspectives pour l’avenir




     Perspectives pour l’avenir




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Quelques idées de nouvelles fonctionnalités


  Suggestions de recherche
        À partir de l’historique
        Propose des recherches proches, fréquentes et ayant
        donné de nombreux résultats

  Gestion améliorée du multilingue
        Ajout d’une détection automatique de la langue
        Choix de la bonne lexemisation en fonction de la langue
        Pouvoir restreindre la recherche par langue




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Possibilité d’intégration à d’autres projets



  Hors Django
        Implémenter une API pour avoir un mode webservice
        Implémenter une API compatible avec le ZCatalog pour
        Zope

  Avec d’autres projets
        Intégration possible avec haystack ?
        Avec des moteurs de classification ?




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Conclusion




                                Conclusion




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
Conclusion




  Situation actuelle
      SeSQL disponible en GPL sur bitbucket
        Utilisé en production sur Libération (front et back)
        Utilisé sur d’autres projets comme Rook




   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL
En attendant

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

  La page de pub
        Pilot Systems, société de services en logiciels libres :
        http://www.pilotsystems.net
        Slides en licence CC-By-Sa
        http://contributions.pilotsystems.net/

                                       Des questions ?

   Yohann G ABORY — Gaël L E M IGNOT Pilot Systems   SeSQL : un moteur de recherche en Python et PostgreSQL

Contenu connexe

Tendances

Tendances (20)

Approche Mda
Approche MdaApproche Mda
Approche Mda
 
Rapport pfe isi_Big data Analytique
Rapport pfe isi_Big data AnalytiqueRapport pfe isi_Big data Analytique
Rapport pfe isi_Big data Analytique
 
Intégration des données avec Talend ETL
Intégration des données avec Talend ETLIntégration des données avec Talend ETL
Intégration des données avec Talend ETL
 
Rapport de stage de perfectionnement - Mahmoudi Mohamed Amine
Rapport de stage de perfectionnement - Mahmoudi Mohamed AmineRapport de stage de perfectionnement - Mahmoudi Mohamed Amine
Rapport de stage de perfectionnement - Mahmoudi Mohamed Amine
 
Rapport de mini projet de programation web
Rapport de mini projet de programation webRapport de mini projet de programation web
Rapport de mini projet de programation web
 
Cours développement côté serveur
Cours développement côté serveurCours développement côté serveur
Cours développement côté serveur
 
Exposé segmentation
Exposé segmentationExposé segmentation
Exposé segmentation
 
Apache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantApache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performant
 
TP1 Big Data - MapReduce
TP1 Big Data - MapReduceTP1 Big Data - MapReduce
TP1 Big Data - MapReduce
 
Cours Big Data Chap2
Cours Big Data Chap2Cours Big Data Chap2
Cours Big Data Chap2
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2
 
Réussir son analyse des besoins dans la conduite d'un projet informatique (2007)
Réussir son analyse des besoins dans la conduite d'un projet informatique (2007)Réussir son analyse des besoins dans la conduite d'un projet informatique (2007)
Réussir son analyse des besoins dans la conduite d'un projet informatique (2007)
 
Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...
Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...
Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...
 
Projet BI - 1 - Analyse des besoins
Projet BI - 1 - Analyse des besoinsProjet BI - 1 - Analyse des besoins
Projet BI - 1 - Analyse des besoins
 
Cahier des charges modèle gratuit - préparez votre projet web facilement !
Cahier des charges modèle gratuit - préparez votre projet web facilement !Cahier des charges modèle gratuit - préparez votre projet web facilement !
Cahier des charges modèle gratuit - préparez votre projet web facilement !
 
BigData_Chp4: NOSQL
BigData_Chp4: NOSQLBigData_Chp4: NOSQL
BigData_Chp4: NOSQL
 
Rapport pfe talan_2018_donia_hammami
Rapport pfe talan_2018_donia_hammamiRapport pfe talan_2018_donia_hammami
Rapport pfe talan_2018_donia_hammami
 
Introduction à Node.js
Introduction à Node.js Introduction à Node.js
Introduction à Node.js
 
Cours Big Data Chap1
Cours Big Data Chap1Cours Big Data Chap1
Cours Big Data Chap1
 
Etude d'une application de gestion d'une bibliothèque numérique
Etude d'une application de gestion d'une bibliothèque numérique Etude d'une application de gestion d'une bibliothèque numérique
Etude d'une application de gestion d'une bibliothèque numérique
 

En vedette

Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec python
Mohammed TAMALI
 
Cypyth formation-programmation-objet-en-langage-python
Cypyth formation-programmation-objet-en-langage-pythonCypyth formation-programmation-objet-en-langage-python
Cypyth formation-programmation-objet-en-langage-python
CERTyou Formation
 
Sondage aléatoire simple ou a probabilité égal
Sondage aléatoire simple ou a probabilité égal Sondage aléatoire simple ou a probabilité égal
Sondage aléatoire simple ou a probabilité égal
hammamiahlem1
 
Je configure mes serveurs avec fabric et fabtools
Je configure mes serveurs avec fabric et fabtoolsJe configure mes serveurs avec fabric et fabtools
Je configure mes serveurs avec fabric et fabtools
Ronan Amicel
 
Les langages de programmation sont trop compliqués
Les langages de programmation sont trop compliquésLes langages de programmation sont trop compliqués
Les langages de programmation sont trop compliqués
mercury_wood
 
Algorithmique_et_programmation_part2
Algorithmique_et_programmation_part2Algorithmique_et_programmation_part2
Algorithmique_et_programmation_part2
Emeric Tapachès
 

En vedette (20)

Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec python
 
Cypyth formation-programmation-objet-en-langage-python
Cypyth formation-programmation-objet-en-langage-pythonCypyth formation-programmation-objet-en-langage-python
Cypyth formation-programmation-objet-en-langage-python
 
OpenStack Havana, tour d'horizon
OpenStack Havana, tour d'horizonOpenStack Havana, tour d'horizon
OpenStack Havana, tour d'horizon
 
La sabiduría
La sabiduríaLa sabiduría
La sabiduría
 
Aiguille dans botte de foin: scikit-learn et joblib
Aiguille dans botte de foin: scikit-learn et joblibAiguille dans botte de foin: scikit-learn et joblib
Aiguille dans botte de foin: scikit-learn et joblib
 
Sondage aléatoire simple ou a probabilité égal
Sondage aléatoire simple ou a probabilité égal Sondage aléatoire simple ou a probabilité égal
Sondage aléatoire simple ou a probabilité égal
 
Solucion y Psicologia del Bienestar
Solucion y Psicologia del BienestarSolucion y Psicologia del Bienestar
Solucion y Psicologia del Bienestar
 
Je configure mes serveurs avec fabric et fabtools
Je configure mes serveurs avec fabric et fabtoolsJe configure mes serveurs avec fabric et fabtools
Je configure mes serveurs avec fabric et fabtools
 
Python et NoSQL
Python et NoSQLPython et NoSQL
Python et NoSQL
 
Python debugger
Python debuggerPython debugger
Python debugger
 
Scikit learn: apprentissage statistique en Python
Scikit learn: apprentissage statistique en PythonScikit learn: apprentissage statistique en Python
Scikit learn: apprentissage statistique en Python
 
Les langages de programmation sont trop compliqués
Les langages de programmation sont trop compliquésLes langages de programmation sont trop compliqués
Les langages de programmation sont trop compliqués
 
Scikit-learn: the state of the union 2016
Scikit-learn: the state of the union 2016Scikit-learn: the state of the union 2016
Scikit-learn: the state of the union 2016
 
Python packaging
Python packagingPython packaging
Python packaging
 
Base NoSql et Python
Base NoSql et PythonBase NoSql et Python
Base NoSql et Python
 
Modelisation agile 03122011
Modelisation agile  03122011Modelisation agile  03122011
Modelisation agile 03122011
 
Presentation r markdown
Presentation r markdown Presentation r markdown
Presentation r markdown
 
Algorithmique_et_programmation_part2
Algorithmique_et_programmation_part2Algorithmique_et_programmation_part2
Algorithmique_et_programmation_part2
 
R versur Python
R versur PythonR versur Python
R versur Python
 
Python et les bases de données non sql
Python et les bases de données non sqlPython et les bases de données non sql
Python et les bases de données non sql
 

Similaire à SeSQL : un moteur de recherche en Python et PostgreSQL

T3UNIFR11 - TYPO3 et les moteurs de recherche
T3UNIFR11 - TYPO3 et les moteurs de rechercheT3UNIFR11 - TYPO3 et les moteurs de recherche
T3UNIFR11 - TYPO3 et les moteurs de recherche
sitengo
 

Similaire à SeSQL : un moteur de recherche en Python et PostgreSQL (20)

Conférence Sesql - DjangoCong 2011
Conférence Sesql - DjangoCong 2011Conférence Sesql - DjangoCong 2011
Conférence Sesql - DjangoCong 2011
 
Indexation d'une base documentaire pour Liberation
Indexation d'une base documentaire pour LiberationIndexation d'une base documentaire pour Liberation
Indexation d'une base documentaire pour Liberation
 
Les micro orm, alternatives à entity framework
Les micro orm, alternatives à entity frameworkLes micro orm, alternatives à entity framework
Les micro orm, alternatives à entity framework
 
Entity framework core 2 vs micro orm performances
Entity framework core 2 vs micro orm performancesEntity framework core 2 vs micro orm performances
Entity framework core 2 vs micro orm performances
 
Google datastore & search API
Google datastore & search APIGoogle datastore & search API
Google datastore & search API
 
Google datastore & search api
Google datastore & search apiGoogle datastore & search api
Google datastore & search api
 
Presentation solr 10 Aout 2011 (french)
Presentation solr 10 Aout 2011 (french)Presentation solr 10 Aout 2011 (french)
Presentation solr 10 Aout 2011 (french)
 
Show de boucane pour ELK
Show de boucane pour ELKShow de boucane pour ELK
Show de boucane pour ELK
 
Mongo db with C#
Mongo db with C#Mongo db with C#
Mongo db with C#
 
Geneva jug Lucene Solr
Geneva jug Lucene Solr Geneva jug Lucene Solr
Geneva jug Lucene Solr
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHP
 
Drools
DroolsDrools
Drools
 
Elasticsearch
ElasticsearchElasticsearch
Elasticsearch
 
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
 
Linq et Entity framework
Linq et Entity frameworkLinq et Entity framework
Linq et Entity framework
 
POO Licence L2 Partie I.pdf
POO Licence L2 Partie I.pdfPOO Licence L2 Partie I.pdf
POO Licence L2 Partie I.pdf
 
Presentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUGPresentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUG
 
T3UNIFR11 - TYPO3 et les moteurs de recherche
T3UNIFR11 - TYPO3 et les moteurs de rechercheT3UNIFR11 - TYPO3 et les moteurs de recherche
T3UNIFR11 - TYPO3 et les moteurs de recherche
 
Spring Batch
Spring BatchSpring Batch
Spring Batch
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overview
 

Plus de Paris, 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 guitaristes
Paris, 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ée
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 Rpx
Paris, France
 

Plus de 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
 

SeSQL : un moteur de recherche en Python et PostgreSQL

  • 1. SeSQL : un moteur de recherche en Python et PostgreSQL Yohann G ABORY — Gaël L E M IGNOT Pilot Systems 11 juillet 2011 Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 2. Plan 1 Introduction Le besoin initial L’historique du projet 2 Fonctionnalités de SeSQL Indexation Recherche Fonctionnalités additionnelles 3 Fonctionnement interne Gestion des dépendances Les short queries Quelques optimisations Benchmarks 4 Perspectives pour l’avenir Nouvelles fonctionnalités Intégration à d’autres projets 5 Conclusion Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 3. Introduction Introduction Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 4. Contexte Contexte général Quotidien Libération Utilisation en back-office dans un premier temps Utilisation en frontal dans un second temps Utilisation de la recherche Navigation Recherches simples Recherches documentaires Solution précédente Propriétaire, sous Windows (TextML) Problèmes de performances et de stabilité Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 5. Solution précédante Schéma d’architecture Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 6. Base d’indexation Volumétrie 703 701 articles 169 017 pages 4 064 478 commentaires (non indexées dans TextML) 100k 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 Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 7. Interface de recherche Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 8. Version initiale Contraintes Devait rester proche de l’architecture existante Devait s’interfacer avec du code PHP/MySQL Solution Un webservice en Python Une base PostgreSQL séparée Une API globalement compatible avec celle de TextML Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 9. Première version de SeSQL Schéma d’architecture Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 10. Deuxième version Contexte L’ensemble du site est en cours de migration en Django On souhaite s’épargner la lourdeur de l’API XML On souhaite rester aussi près que possible de Django Solution Une application Django Les recherches s’expriment avec l’objet Q de Django SeSQL renvoie des objets Django Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 11. Deuxième version de SeSQL Schéma d’architecture Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 12. Fonctionnalités de SeSQL Fonctionnalités de SeSQL Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 13. Définition de l’indexation Types d’index Types simples : entiers, dates, ... Champs full text Champ multi-valués (pour des relations par exemple) Sources des index Champs du modèle Appel à des méthodes du modèle Suivi des relations Index composite : concaténation, premier non vide, ... Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 14. Intégration avec Django Configuration de SeSQL Une application comme une autre, qui doit être ajoutée dans le settings.py Nécessite un back-end PostgreSQL A son propre fichier de configuration, sesql_config.py Définition des modèles à indexer S’effectue via la TYPE_MAP dans la configuration Par défaut suit les héritages Permet de regrouper les contenus cherchés souvent ensembles SeSQL utilise un simple signal post_save Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 15. Un sesql_config minimaliste FIELDS = (ClassField("classname"), LongIntField("id"), DateTimeField("created_at"), FullTextField("user","user.screen_name"), LongIntField("user_id", "user.id"), FullTextField("text", ["text"], primary=True, dictionnary = ’public.lem_french’, ), ) Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 16. un exemple d’intégration Rook : Recherche 1 500 000 Tweets en full text Des requètes complexes : tweets = Tweet.objects.filter( user__relation__in = user.relation_set.filter(user_type = "followers") ).filter(text__icontains = mot).order_by(’-created_at’) Simplissime avec SeSQL : ids = request.user.relation_set.filter(user_type="friends").only(’id’) results = longquery(Q(user_id__in = ids)& Q(text__containswords = request.GET[’search’] )) Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 17. Gestion de la lexemisation Principe Prendre le radical des mots Peut être très compliqué : cheval, chevaux, chevalet Dépend de la langue Peut provoquer des effets de bord Dans SeSQL Utilise les text search configuration de PostgreSQL SeSQL effectue un nettoyage supplémentaire (accents, majuscules, entités HTML, ...) Peut être défini de manière différente par index Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 18. Description d’une recherche Utilisation de l’objet Q SeSQL utilise l’objet Q de Django Il permet de définir des recherches complexes, avec des ET, OU, négations, ... Chaque élément est composé de : un index, un opérateur et une valeur Les opérateurs Sur du texte : containswords, containsexact, ... Sur des tableaux : containsall, containsany, ... Opérateurs génériques : plus petit, plus grand, ... Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 19. Long query et short query Short query Requêtes pour de la navigation, un portlet, un aperçu, ... Limité à un petit nombre (par exemple 50) de résultats Ne supporte pas le tri par pertinence Extrêmement rapides Long query Supporte la pagination de manière stable Envoi le nombre exact de résultats Peut être plus lente dans certains cas Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 20. Quelques bonus Le tri Sur un index numérique ou de date Ou alors par pertinence, avec gestion : de la pondération (le titre compte plus que le corps du texte) de la proximité des mots cherchés de la fréquence des mots cherchés Les résultats SeSQLResultSet est un générateur Python, donc lazy Renvoi directement les objets Django à l’itération Les objets peuvent être de plusieurs types Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 21. Et en prime... Aide au highlight Un module spécial est fourni Il renvoi la liste des positions, en caractères, des mots ayant été trouvés SeSQL admin Permet d’utiliser SeSQL depuis l’admin Django Assez intrusif pour l’instant, donc désactivé par défaut Historique Collecte les historiques de recherche, en option Compte le nombre de résultats et la fréquence des recherches Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 22. Fonctionnement interne Fonctionnement interne Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 23. Gestion des dépendances : le problème Un exemple Dans un module de Quizz, on veut indexer les réponses possibles dans l’objet Quizz Facile à faire avec SeSQL et les index composites Mais si on modifie une réponse, on ne modifie pas l’objet Quizz Les conséquences On veut pouvoir réindexer les objets liés quand on réindexe un objet Mais il peut y en avoir énormément : imaginons qu’on change le nom d’un auteur de 147 789 articles du journal ! Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 24. Gestion des dépendances : la solution Le principe SeSQL stocke la liste des objets à ré-indexer Un daemon autonome s’occupe de les ré-indexer, petit à petit En pratique SeSQL ne détecte pas tout seul les objets liés Les modèles peuvent implémenter une méthode spécifique, qui indique à SeSQL ce qui doit être réindexé Cette méthode peut renvoyer des objets ou des couples (class, id). Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 25. Les short queries : le problème Rappel du contexte Trouver les 50 articles les plus récentes sur un sujet Doit être le plus rapide possible Les deux query plans 1 Parcourir l’index sur les dates, et filtrer les articles 2 Utiliser l’index sur les articles, puis trier sur les dates La limite de PostgreSQL PostgreSQL a des statistiques sur les mots Mais un mot peut être avoir été fréquent mais ne plus l’être Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 26. Exemple de plan 1 Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 27. Exemple de plan 2 Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 28. L’heuristique L’algorithme Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 29. Recherche par texte exact Problème PostgreSQL n’a pas d’index supportant ça Faire un LIKE sur toute la base est bien trop lent La solution On commence pas filtrer, via l’index, en texte approché Puis on refiltre avec un LIKE sur ce qui matché La cas France 2 Beaucoup d’article contiennent les deux mots Mais peu le texte exact Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 30. Les partitions Problème On veut indexer du contenu très massif (les commentaires) On ne veut pas impacter les performances du reste La solution PostgreSQL supporte l’héritage de tables On indexe les commentaires dans une table à part On ne cherche que dans une sous-table, si possible Si non, on cherche dans la table maîtresse Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 31. There are three kinds of lies ... Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 32. ... lies, damn lies and benchmarks Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 33. Perspectives pour l’avenir Perspectives pour l’avenir Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 34. Quelques idées de nouvelles fonctionnalités Suggestions de recherche À partir de l’historique Propose des recherches proches, fréquentes et ayant donné de nombreux résultats Gestion améliorée du multilingue Ajout d’une détection automatique de la langue Choix de la bonne lexemisation en fonction de la langue Pouvoir restreindre la recherche par langue Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 35. Possibilité d’intégration à d’autres projets Hors Django Implémenter une API pour avoir un mode webservice Implémenter une API compatible avec le ZCatalog pour Zope Avec d’autres projets Intégration possible avec haystack ? Avec des moteurs de classification ? Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 36. Conclusion Conclusion Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 37. Conclusion Situation actuelle SeSQL disponible en GPL sur bitbucket Utilisé en production sur Libération (front et back) Utilisé sur d’autres projets comme Rook Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL
  • 38. En attendant Remerciements aux communautés PostgreSQL, Python et Django à Libération de nous avoir fait confiance à Jérôme Petazzoni qui a contribué à la conception La page de pub Pilot Systems, société de services en logiciels libres : http://www.pilotsystems.net Slides en licence CC-By-Sa http://contributions.pilotsystems.net/ Des questions ? Yohann G ABORY — Gaël L E M IGNOT Pilot Systems SeSQL : un moteur de recherche en Python et PostgreSQL