Vous êtes ici : Accueil / 2010 / Septembre / SeSQL - un moteur de recherche "full text" performant et puissant

SeSQL - un moteur de recherche "full text" performant et puissant

écrit le 16/03/2011 Par Gaël Le Mignot
Pilot Systems, en partenariat avec le journal Libération, a réalisé un moteur de recherche "full text" reposant intégralement sur des technologies libres : Python et PostgreSQL. Cet article explique les possibilités et usages du moteur, et retrace sa conception.

Historique de SeSQL

Génèse du projet

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 :

  • sur la volumétrie tout d'abord, avec une base de données contenant plus de 500 000 articles et 2 000 000 de commentaires ;
  • sur la rapidité de réponse, le moteur de recherche étant un outil fondamental pour les journalistes, il était impératif d'avoir un temps de réponse très inférieur à la seconde sur la quasi-totalité des demandes ;
  • sur la richesse des requêtes, le back-office de Libération permettant de définir des critères assez fins, sur des dates (de publication, de modification, ...), du texte, des catégories, des auteurs, des états de publication, ...

Cette première version de SeSQL fonctionnait sous la forme d'un démon Python interrogeable par une API REST.

La version Django

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/

Fonctionnalités de SeSQL

Définition des index

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.

Recherche full text

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").

Recherche multi-critères

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.

Gestion des dépendances

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.

Performances de SeSQL

Quelques benchmarks

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/

Short queries et full queries

Afin d'obtenir des performances optimales y compris sous forte charge, SeSQL propose deux modes de recherche :

  1. Une recherche courte (short query), qui ne renvoie qu'un petit nombre de résultats (par exemple 50), triés sur un critère de date (par exemple une date de publication). Cette recherche courte est extrêmement rapide, de l'ordre de quelques milisecondes.
  2. Une recherche complète (long query), qui permet de connaître le nombre exact de résultats de gérer une pagination dans ces résultats (afficher les résultats de 150 à 200 par exemple). Cette recherche est parfois plus lente, mais reste normalement inférieure à la seconde (tout dépend bien sûr du nombre d'articles de la base et de la puissance de la machine).

Utilisations typiques de SeSQL

En frontal

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

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.

Utilisations actuelles

SeSQL est actuellement en production à trois endroits :

  1. Le back-office de recherche utilisé par les journalistes et documentalistes de Libération.
  2. Le frontal de recherche du site http://www.jeparticipe.org
  3. Le frontal de recherche du site http://next.liberation.fr
  4. Et depuis peu le frontal de recherche du site principal de Libération, http://www.liberation.fr

Actions sur le document