veilletech.fr
20 sept. Feed du jour
#04 POSTGRES Article

TIN : la recherche plein texte que Postgres n’a pas

Un index plein texte ne se juge pas sur sa vitesse à vide, mais sur ce qu'il devient pendant que la table bouge.

PlanetScale publie TIN, une extension de recherche plein texte pour Postgres qui apporte BM25, requêtes de phrase, flou, jokers et expressions régulières dans un seul index. Les mesures de l'éditeur la donnent 25 fois plus rapide que ParadeDB sur des requêtes mixtes, et l'index se construit en 8 minutes là où GIN met plus de deux heures.

3 min de lectureintermédiairevidéo 1:18
Partager
Sommaire4 sections
  1. Ce qui se passe
  2. Les chiffres, et d'où ils viennent
  3. La limite à vérifier avant de bâtir dessus
  4. À retenir

Ce qui se passe

PlanetScale a annoncé le 16 septembre 2026 TIN — pour Text INdex —, une extension de recherche plein texte pour Postgres, publiée en version stable. L'usage tient en deux instructions : un index, puis un opérateur dédié dans le WHERE.

SQL
CREATE INDEX idx_description ON products USING tin(description);

-- Conjonction : tous les termes
SELECT * FROM products WHERE description ==> 'stretch denim jeans'
ORDER BY tin.score(ctid) DESC LIMIT 10;

-- Phrase exacte, et disjonction entre crochets
SELECT COUNT(*) FROM photos WHERE tags ==> '"san francisco"';
SELECT * FROM emails WHERE body ==> '[insider trading conspiracy]';

Le périmètre couvert est le point : expressions booléennes, requêtes de phrase et de proximité, correspondance floue, jokers et expressions régulières sur les termes, repli de casse et d'accents, COUNT(*) et top-k classé par BM25. L'éditeur note que trois index plein texte existent déjà pour Postgres, mais qu'aucun ne cochait toutes ces cases tout en supportant jointures, écritures continues, réplication, sauvegardes et visibilité transactionnelle correcte.

Les chiffres, et d'où ils viennent

Le banc d'essai est celui de PlanetScale, contre ses concurrents directs — à lire comme tel. Corpus Stack Exchange de 85 Go, 150 millions de documents, 1 719 requêtes générées à partir de sous-chaînes de 2 à 15 termes. Machine : AWS i7i.8xlarge, NVMe local, Postgres 18.6 confiné à 8 vCPU et 32 Go. Versions comparées : TIN 1.0.2, ParadeDB 0.25.2, pg_textsearch 1.4.0 et l'index GIN natif. Seuls TIN et ParadeDB ont terminé l'ensemble des scénarios.

Construction de l'index Durée Taille RAM nécessaire
TIN 1.0.2 8 min 10 50,7 Go 32 Go
ParadeDB 0.25.2 19 min 20 52,1 Go 64 Go
pg_textsearch 1.4.0 26 min 49 41,5 Go 128 Go
Postgres GIN 2 h 09 min 04 28,0 Go 64 Go

Sur des requêtes mixtes classées top-10, TIN tient 199 requêtes par seconde contre 7,9 pour ParadeDB, avec un p99 de 256 ms contre 6 765 ms. Sur conjonction et phrase, l'écart est de 10× face à ParadeDB et 541× face à GIN. GIN ne termine pas les scénarios de disjonction : il épuise la mémoire.

Le scénario le plus parlant est celui avec écritures concurrentes, à 1 000 UPDATE par seconde : sur dix minutes, TIN passe 270 279 mises à jour, ParadeDB 185 584, et pg_textsearch 735 — chez ce dernier, le trafic de lecture continu empêche les écritures d'obtenir leurs verrous, et elles calent au bout de quelques secondes.

Dernier chiffre, moins spectaculaire mais structurant : la donnée lue par requête. 65 Mo pour TIN contre 582 Mo pour ParadeDB sur le scénario mixte. C'est ce qui explique une partie de l'écart, et surtout ce qui fait que les autres requêtes du même serveur ne subissent pas la recherche.

La limite à vérifier avant de bâtir dessus

L'annonce parle d'une disponibilité immédiate « pour toutes les bases Postgres et Neki » — c'est-à-dire sur la plateforme de PlanetScale. Rien dans le billet ne décrit l'installation de l'extension sur un serveur Postgres que vous administrez. Sur une base auto-hébergée, c'est le premier point à trancher.

Source : Introducing TIN: full-text search for Postgres, PlanetScale, 16 septembre 2026.