Présentation

Le projet TIN (Textual Inverted Index) est désormais disponible en tant qu’extension officielle de PostgreSQL. Il ajoute un moteur de recherche plein texte capable de gérer des requêtes booléennes, de phrase, floues, à caractères génériques, d’expression régulière et, surtout, de classement BM25. Cette palette de fonctionnalités place TIN au même niveau que les solutions spécialisées tout en restant intégré au SGBD relationnel.

Architecture et fonctionnement

TIN crée un index inversé dédié à chaque colonne texte indexée. Lors de l’insertion, le texte est tokenisé, normalisé (lower‑case, stemming) puis chaque terme est associé à un posting list contenant les identifiants de ligne et la position du terme. Le moteur conserve, pour chaque terme, les statistiques nécessaires au calcul BM25 (fréquence du document, fréquence du terme dans le corpus). Les requêtes sont traduites en plans d’exécution PostgreSQL qui exploitent ces posting lists, permettant ainsi d’utiliser les opérateurs de jointure et de filtrage natifs du moteur. Le support des expressions régulières et des jokers repose sur un pré‑filtrage des termes avant la recherche dans l’index, limitant le nombre de comparaisons coûteuses.

Benchmarks et performances

PlanetScale a publié un benchmark interne sur son corpus de test. La construction de l’index complet a duré 8 minutes 10 secondes, ce qui montre que l’étape d’ingestion reste raisonnable même pour des jeux de données de plusieurs dizaines de gigaoctets. En phase de requête, TIN a atteint jusqu’à 57 fois plus de débit que les extensions concurrentes testées, notamment sous des charges d’écriture simultanées. Cette amélioration provient du modèle d’accès en lecture‑seule aux posting lists et de l’optimisation du calcul BM25 directement dans le plan d’exécution, évitant ainsi des passes supplémentaires en mémoire. Les mesures incluent des requêtes de type « match all », des filtres booléens complexes et des recherches floues, confirmant la robustesse du moteur dans des scénarios variés.

Limites et considérations

Les performances annoncées sont issues de benchmarks réalisés dans un environnement contrôlé par le fournisseur. Elles ne tiennent pas compte d’éventuels goulets d’étranglement liés à la configuration du disque, à la taille du cache ou à la concurrence d’autres extensions. De plus, le calcul BM25 nécessite la mise à jour des statistiques d’indice à chaque insertion ou suppression, ce qui peut augmenter le coût d’écriture dans des flux très actifs. Enfin, le support des expressions régulières reste dépendant de la complexité du pattern ; des regex très larges peuvent entraîner une dégradation notable du temps de réponse.