31.07.2015 Views

SeSQL : un moteur de recherche en Python et ... - RMLL 2011

SeSQL : un moteur de recherche en Python et ... - RMLL 2011

SeSQL : un moteur de recherche en Python et ... - RMLL 2011

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong>PostgreSQLYohann GABORY — Gaël LE MIGNOTPilot Systems11 juill<strong>et</strong> <strong>2011</strong>Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Plan1 IntroductionLe besoin initialL’historique du proj<strong>et</strong>2 Fonctionnalités <strong>de</strong> <strong>SeSQL</strong>In<strong>de</strong>xationRechercheFonctionnalités additionnelles3 Fonctionnem<strong>en</strong>t interneGestion <strong>de</strong>s dép<strong>en</strong>dancesLes short queriesQuelques optimisationsB<strong>en</strong>chmarks4 Perspectives pour l’av<strong>en</strong>irNouvelles fonctionnalitésIntégration à d’autres proj<strong>et</strong>s5 ConclusionYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


IntroductionIntroductionYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


ContexteContexte généralQuotidi<strong>en</strong> LibérationUtilisation <strong>en</strong> back-office dans <strong>un</strong> premier tempsUtilisation <strong>en</strong> frontal dans <strong>un</strong> second tempsUtilisation <strong>de</strong> la <strong>recherche</strong>NavigationRecherches simplesRecherches docum<strong>en</strong>tairesSolution précé<strong>de</strong>ntePropriétaire, sous Windows (TextML)Problèmes <strong>de</strong> performances <strong>et</strong> <strong>de</strong> stabilitéYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Solution précédanteSchéma d’architectureYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Base d’in<strong>de</strong>xationVolumétrie703 701 articles169 017 pages4 064 478 comm<strong>en</strong>taires (non in<strong>de</strong>xées dans TextML)100k cont<strong>en</strong>us diversTypes d’in<strong>de</strong>xRecherche <strong>en</strong> texte pleinRecherche sur texte exactFiltres sur <strong>de</strong>s méta-données : auteurs, catégories, . . .Tri par dateYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Interface <strong>de</strong> <strong>recherche</strong>Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Version initialeContraintesDevait rester proche <strong>de</strong> l’architecture existanteDevait s’interfacer avec du co<strong>de</strong> PHP/MySQLSolutionUn webservice <strong>en</strong> <strong>Python</strong>Une base PostgreSQL séparéeUne API globalem<strong>en</strong>t compatible avec celle <strong>de</strong> TextMLYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Première version <strong>de</strong> <strong>SeSQL</strong>Schéma d’architectureYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Deuxième versionContexteL’<strong>en</strong>semble du site est <strong>en</strong> cours <strong>de</strong> migration <strong>en</strong> DjangoOn souhaite s’épargner la lour<strong>de</strong>ur <strong>de</strong> l’API XMLOn souhaite rester aussi près que possible <strong>de</strong> DjangoSolutionUne application DjangoLes <strong>recherche</strong>s s’exprim<strong>en</strong>t avec l’obj<strong>et</strong> Q <strong>de</strong> Django<strong>SeSQL</strong> r<strong>en</strong>voie <strong>de</strong>s obj<strong>et</strong>s DjangoYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Deuxième version <strong>de</strong> <strong>SeSQL</strong>Schéma d’architectureYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Fonctionnalités <strong>de</strong> <strong>SeSQL</strong>Fonctionnalités <strong>de</strong> <strong>SeSQL</strong>Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Définition <strong>de</strong> l’in<strong>de</strong>xationTypes d’in<strong>de</strong>xTypes simples : <strong>en</strong>tiers, dates, ...Champs full textChamp multi-valués (pour <strong>de</strong>s relations par exemple)Sources <strong>de</strong>s in<strong>de</strong>xChamps du modèleAppel à <strong>de</strong>s métho<strong>de</strong>s du modèleSuivi <strong>de</strong>s relationsIn<strong>de</strong>x composite : concaténation, premier non vi<strong>de</strong>, ...Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Intégration avec DjangoConfiguration <strong>de</strong> <strong>SeSQL</strong>Une application comme <strong>un</strong>e autre, qui doit être ajoutéedans le s<strong>et</strong>tings.pyNécessite <strong>un</strong> back-<strong>en</strong>d PostgreSQLA son propre fichier <strong>de</strong> configuration, sesql_config.pyDéfinition <strong>de</strong>s modèles à in<strong>de</strong>xerS’effectue via la TYPE_MAP dans la configurationPar défaut suit les héritagesPerm<strong>et</strong> <strong>de</strong> regrouper les cont<strong>en</strong>us cherchés souv<strong>en</strong>t<strong>en</strong>sembles<strong>SeSQL</strong> utilise <strong>un</strong> simple signal post_saveYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Un sesql_config minimalisteFIELDS = (ClassField("classname"),LongIntField("id"),DateTimeField("created_at"),FullTextField("user","user.scre<strong>en</strong>_name"),LongIntField("user_id", "user.id"),FullTextField("text",["text"],primary=True,dictionnary = ’public.lem_fr<strong>en</strong>ch’,),)Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


<strong>un</strong> exemple d’intégration Rook : Recherche1 500 000 Twe<strong>et</strong>s <strong>en</strong> full textDes requètes complexes :twe<strong>et</strong>s = Twe<strong>et</strong>.objects.filter(user__relation__in = user.relation_s<strong>et</strong>.filter(user_type = "followers")).filter(text__icontains = mot).or<strong>de</strong>r_by(’-created_at’)Simplissime avec <strong>SeSQL</strong> :ids = request.user.relation_s<strong>et</strong>.filter(user_type="fri<strong>en</strong>ds").only(’id’)results = longquery(Q(user_id__in = ids)&Q(text__containswords = request.GET[’search’] ))Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Gestion <strong>de</strong> la lexemisationPrincipePr<strong>en</strong>dre le radical <strong>de</strong>s motsPeut être très compliqué : cheval, chevaux, cheval<strong>et</strong>Dép<strong>en</strong>d <strong>de</strong> la languePeut provoquer <strong>de</strong>s eff<strong>et</strong>s <strong>de</strong> bordDans <strong>SeSQL</strong>Utilise les text search configuration <strong>de</strong> PostgreSQL<strong>SeSQL</strong> effectue <strong>un</strong> n<strong>et</strong>toyage supplém<strong>en</strong>taire (acc<strong>en</strong>ts,majuscules, <strong>en</strong>tités HTML, ...)Peut être défini <strong>de</strong> manière différ<strong>en</strong>te par in<strong>de</strong>xYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Description d’<strong>un</strong>e <strong>recherche</strong>Utilisation <strong>de</strong> l’obj<strong>et</strong> Q<strong>SeSQL</strong> utilise l’obj<strong>et</strong> Q <strong>de</strong> DjangoIl perm<strong>et</strong> <strong>de</strong> définir <strong>de</strong>s <strong>recherche</strong>s complexes, avec <strong>de</strong>sET, OU, négations, ...Chaque élém<strong>en</strong>t est composé <strong>de</strong> : <strong>un</strong> in<strong>de</strong>x, <strong>un</strong> opérateur<strong>et</strong> <strong>un</strong>e valeurLes opérateursSur du texte : containswords, containsexact, ...Sur <strong>de</strong>s tableaux : containsall, containsany, ...Opérateurs génériques : plus p<strong>et</strong>it, plus grand, ...Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Long query <strong>et</strong> short queryShort queryRequêtes pour <strong>de</strong> la navigation, <strong>un</strong> portl<strong>et</strong>, <strong>un</strong> aperçu, ...Limité à <strong>un</strong> p<strong>et</strong>it nombre (par exemple 50) <strong>de</strong> résultatsNe supporte pas le tri par pertin<strong>en</strong>ceExtrêmem<strong>en</strong>t rapi<strong>de</strong>sLong querySupporte la pagination <strong>de</strong> manière stableEnvoi le nombre exact <strong>de</strong> résultatsPeut être plus l<strong>en</strong>te dans certains casYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Quelques bonusLe triSur <strong>un</strong> in<strong>de</strong>x numérique ou <strong>de</strong> dateOu alors par pertin<strong>en</strong>ce, avec gestion :<strong>de</strong> la pondération (le titre compte plus que le corps dutexte)<strong>de</strong> la proximité <strong>de</strong>s mots cherchés<strong>de</strong> la fréqu<strong>en</strong>ce <strong>de</strong>s mots cherchésLes résultats<strong>SeSQL</strong>ResultS<strong>et</strong> est <strong>un</strong> générateur <strong>Python</strong>, donc lazyR<strong>en</strong>voi directem<strong>en</strong>t les obj<strong>et</strong>s Django à l’itérationLes obj<strong>et</strong>s peuv<strong>en</strong>t être <strong>de</strong> plusieurs typesYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Et <strong>en</strong> prime...Ai<strong>de</strong> au highlightUn module spécial est fourniIl r<strong>en</strong>voi la liste <strong>de</strong>s positions, <strong>en</strong> caractères, <strong>de</strong>s motsayant été trouvés<strong>SeSQL</strong> adminPerm<strong>et</strong> d’utiliser <strong>SeSQL</strong> <strong>de</strong>puis l’admin DjangoAssez intrusif pour l’instant, donc désactivé par défautHistoriqueCollecte les historiques <strong>de</strong> <strong>recherche</strong>, <strong>en</strong> optionCompte le nombre <strong>de</strong> résultats <strong>et</strong> la fréqu<strong>en</strong>ce <strong>de</strong>s<strong>recherche</strong>sYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Fonctionnem<strong>en</strong>t interneFonctionnem<strong>en</strong>t interneYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Gestion <strong>de</strong>s dép<strong>en</strong>dances : le problèmeUn exempleDans <strong>un</strong> module <strong>de</strong> Quizz, on veut in<strong>de</strong>xer les réponsespossibles dans l’obj<strong>et</strong> QuizzFacile à faire avec <strong>SeSQL</strong> <strong>et</strong> les in<strong>de</strong>x compositesMais si on modifie <strong>un</strong>e réponse, on ne modifie pas l’obj<strong>et</strong>QuizzLes conséqu<strong>en</strong>cesOn veut pouvoir réin<strong>de</strong>xer les obj<strong>et</strong>s liés quand onréin<strong>de</strong>xe <strong>un</strong> obj<strong>et</strong>Mais il peut y <strong>en</strong> avoir énormém<strong>en</strong>t : imaginons qu’onchange le nom d’<strong>un</strong> auteur <strong>de</strong> 147 789 articles du journal !Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Gestion <strong>de</strong>s dép<strong>en</strong>dances : la solutionLe principe<strong>SeSQL</strong> stocke la liste <strong>de</strong>s obj<strong>et</strong>s à ré-in<strong>de</strong>xerUn daemon autonome s’occupe <strong>de</strong> les ré-in<strong>de</strong>xer, p<strong>et</strong>it àp<strong>et</strong>itEn pratique<strong>SeSQL</strong> ne détecte pas tout seul les obj<strong>et</strong>s liésLes modèles peuv<strong>en</strong>t implém<strong>en</strong>ter <strong>un</strong>e métho<strong>de</strong>spécifique, qui indique à <strong>SeSQL</strong> ce qui doit être réin<strong>de</strong>xéC<strong>et</strong>te métho<strong>de</strong> peut r<strong>en</strong>voyer <strong>de</strong>s obj<strong>et</strong>s ou <strong>de</strong>s couples(class, id).Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Les short queries : le problèmeRappel du contexteTrouver les 50 articles les plus réc<strong>en</strong>tes sur <strong>un</strong> suj<strong>et</strong>Doit être le plus rapi<strong>de</strong> possibleLes <strong>de</strong>ux query plans1 Parcourir l’in<strong>de</strong>x sur les dates, <strong>et</strong> filtrer les articles2 Utiliser l’in<strong>de</strong>x sur les articles, puis trier sur les datesLa limite <strong>de</strong> PostgreSQLPostgreSQL a <strong>de</strong>s statistiques sur les motsMais <strong>un</strong> mot peut être avoir été fréqu<strong>en</strong>t mais ne plus l’êtreYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Exemple <strong>de</strong> plan 1Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Exemple <strong>de</strong> plan 2Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


L’heuristiqueL’algorithmeYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Recherche par texte exactProblèmePostgreSQL n’a pas d’in<strong>de</strong>x supportant çaFaire <strong>un</strong> LIKE sur toute la base est bi<strong>en</strong> trop l<strong>en</strong>tLa solutionOn comm<strong>en</strong>ce pas filtrer, via l’in<strong>de</strong>x, <strong>en</strong> texte approchéPuis on refiltre avec <strong>un</strong> LIKE sur ce qui matchéLa cas France 2Beaucoup d’article conti<strong>en</strong>n<strong>en</strong>t les <strong>de</strong>ux motsMais peu le texte exactYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Les partitionsProblèmeOn veut in<strong>de</strong>xer du cont<strong>en</strong>u très massif (les comm<strong>en</strong>taires)On ne veut pas impacter les performances du resteLa solutionPostgreSQL supporte l’héritage <strong>de</strong> tablesOn in<strong>de</strong>xe les comm<strong>en</strong>taires dans <strong>un</strong>e table à partOn ne cherche que dans <strong>un</strong>e sous-table, si possibleSi non, on cherche dans la table maîtresseYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


There are three kinds of lies ...Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


... lies, damn lies and b<strong>en</strong>chmarksYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Perspectives pour l’av<strong>en</strong>irPerspectives pour l’av<strong>en</strong>irYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Quelques idées <strong>de</strong> nouvelles fonctionnalitésSuggestions <strong>de</strong> <strong>recherche</strong>À partir <strong>de</strong> l’historiquePropose <strong>de</strong>s <strong>recherche</strong>s proches, fréqu<strong>en</strong>tes <strong>et</strong> ayantdonné <strong>de</strong> nombreux résultatsGestion améliorée du multilingueAjout d’<strong>un</strong>e détection automatique <strong>de</strong> la langueChoix <strong>de</strong> la bonne lexemisation <strong>en</strong> fonction <strong>de</strong> la languePouvoir restreindre la <strong>recherche</strong> par langueYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


Possibilité d’intégration à d’autres proj<strong>et</strong>sHors DjangoImplém<strong>en</strong>ter <strong>un</strong>e API pour avoir <strong>un</strong> mo<strong>de</strong> webserviceImplém<strong>en</strong>ter <strong>un</strong>e API compatible avec le ZCatalog pourZopeAvec d’autres proj<strong>et</strong>sIntégration possible avec haystack ?Avec <strong>de</strong>s <strong>moteur</strong>s <strong>de</strong> classification ?Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


ConclusionConclusionYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


ConclusionSituation actuelle<strong>SeSQL</strong> disponible <strong>en</strong> GPL sur bitbuck<strong>et</strong>Utilisé <strong>en</strong> production sur Libération (front <strong>et</strong> back)Utilisé sur d’autres proj<strong>et</strong>s comme RookYohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL


En att<strong>en</strong>dantRemerciem<strong>en</strong>tsaux comm<strong>un</strong>autés PostgreSQL, <strong>Python</strong> <strong>et</strong> Djangoà Libération <strong>de</strong> nous avoir fait confianceà Jérôme P<strong>et</strong>azzoni qui a contribué à la conceptionLa page <strong>de</strong> pubPilot Systems, société <strong>de</strong> services <strong>en</strong> logiciels libres :http://www.pilotsystems.n<strong>et</strong>Sli<strong>de</strong>s <strong>en</strong> lic<strong>en</strong>ce CC-By-Sahttp://contributions.pilotsystems.n<strong>et</strong>/Des questions ?Yohann GABORY — Gaël LE MIGNOT Pilot Systems<strong>SeSQL</strong> : <strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>en</strong> <strong>Python</strong> <strong>et</strong> PostgreSQL

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!