Le projet SeSQL (Search Enginne SQL) a démarré lorsque le moteur d'indexation utilisé par le back-office du journal Libération est arrivé à saturation en terme de performances et de tenue de charge, en raison de la forte volumétrie des contenus.
Pilot Systems a donc développé, en coopération avec Libération, un moteur de recherche s'appuyant sur des technologies libres (Python et PostgreSQL), afin de remplacer la solution précédente.
Les contraintes étaient de trois types :
Cette première version de SeSQL fonctionnait sous la forme d'un démon Python interrogeable par une API REST.
Par la suite, une deuxième version de SeSQL a été écrite, reprenant une grande partie du code de la première version, mais conçue pour s'intégrer pleinement avec le framework Django.
Cette version est publiée sur http://bitbucket.org/liberation/sesql/
SeSQL permet de définir des index de manière souple et puissante. Un index peut aller chercher des informations dans du contenu lié par des relations SQL (par exemple, inclure le contenu des commentaires d'un article dans l'un des index de l'article lui-même).
Il est possible de définir plusieurs index, y compris plusieurs index full text, par exemple un index n'incluant que des champs publics, et un autre incluant des champs privés.
Le coeur de SeSQL est la possibilité de faire des recherches full text de manière efficace. Une recherche full text est une recherche du type « tous les articles de ma base qui contiennent les mots "moteur de recherche" ».
Cette recherche full text reconnaît les mots inutiles (par exemple le "de" dans la recherche précédente) et est capable, si on le souhaite, de remonter à la racine d'un mot (par exemple trouver un article parlant de "chevaux" si on demande "cheval").
SeSQL est capable de chercher sur des critères de types différents (full text, dates, nombres, champs multi-valués, ...) simultanément, avec une gestion des connecteurs logiques (ou, et, négation). Dans la version Django, les requêtes s'expriment naturellement avec l'opérateur Q de Django.
SeSQL gérant les index composites (capables d'aller chercher des informations dans des éléments liés), il gère de manière semi-automatique les dépendances entre les éléments. Par exemple, si on choisit d'index dans l'un des index d'un article le nom complet de l'objet auteur qui lui est lié, et que le nom de l'auteur est modifié, SeSQL va ré-indexer tous les articles liés à cet auteur.
Cette ré-indexation pouvant être massive (dans le cas d'une grande base de données, elle porter sur des centaines de milliers d'objets), elle sera effectuée en tâche de fond, petit à petit, par un processus autonome.
Les benchmarks effectués sur la première version SeSQL sont parfaitement conforme à l'attente : dans le cas de requêtes séquentielles (une seule à la fois), SeSQL a été capable de traiter un échantillon de 19000 requêtes (provenant des logs de production, et donc correspondant à l'utilisation réelle du système) en 329 secondes, soit un temps moyen de 17 ms par requête, et la requête la plus lente a été traitée en 0.61 seconde.
En accès simultané les performances se dégradent mais légèrement : même avec 4 recherches et 3 insertions simultanées en continu, le temps moyen reste à 171 ms par requête, et seules 3% des requêtes dépassent la seconde.
Plus de précisions sont disponibles sur http://contributions.pilotsystems.net/publications/supports-de-conferences/conference-pgdays-2009-indexation-de-la-base-documentaire-de-liberation/
Afin d'obtenir des performances optimales y compris sous forte charge, SeSQL propose deux modes de recherche :
SeSQL peut être utilisé comme moteur de recherche frontal sur un site à fort volumétrie de contenus. Dans ce cas, l'utilisation la plus optimale est d'afficher tous les contenus (pouvant être de différents types, par exemple des articles et des événements) correspondant aux mots recherchés, triés par date de publication.
SeSQL est aussi capable de trier les éléments par pertinence, bien que ce tri soit légèrement plus coûteux en performances.
En back-office, SeSQL permet de faire des recherches correspondant à des critères plus riches, et peut chercher sur des index différents de ceux utilisés en frontal.
Un projet d'intégration de SeSQL comme moteur de recherche de l'interface d'administration Django est actuellement en cours de développement.
SeSQL est actuellement en production à trois endroits :
Actions sur le document