Les extensions : pgvector, pg_trgm, full-text
L'idée : une base, plusieurs moteurs de recherche
Le cours Stack IA a montrĂ© la recherche hybride du matcher â quatre sources fusionnĂ©es, toutes dans PostgreSQL. Cette leçon dĂ©taille les trois extensions qui rendent ça possible, et pourquoi les regrouper dans une seule base est un choix architectural fort (une transaction, une sauvegarde, une RLS â pas de moteur de recherche sĂ©parĂ© Ă synchroniser).
Full-text search (natif) : les mots, pas les octets
-- une colonne tsvector (souvent GĂNĂRĂE) + un index GIN
ALTER TABLE variant ADD COLUMN search_text tsvector
GENERATED ALWAYS AS (to_tsvector('french', name || ' ' || description)) STORED;
CREATE INDEX ON variant USING gin (search_text);
-- rechercher
SELECT *, ts_rank_cd(search_text, query) AS score
FROM variant, websearch_to_tsquery('french', 'boulon inox') query
WHERE search_text @@ query ORDER BY score DESC;
to_tsvector dĂ©coupe et lemmatise (« boulons » â « boulon »), websearch_to_tsquery parse une requĂȘte façon moteur de recherche, ts_rank_cd classe par densitĂ© de couverture. La colonne gĂ©nĂ©rĂ©e (calculĂ©e par la base Ă chaque Ă©criture) garantit qu'elle est toujours Ă jour â un pattern JSONB/FTS Ă©lĂ©gant.
pg_trgm : la recherche floue (fautes de frappe)
CREATE EXTENSION pg_trgm;
CREATE INDEX ON variant USING gin (name gin_trgm_ops);
SELECT *, similarity(name, 'bulon inox') AS sim
FROM variant WHERE name % 'bulon inox' ORDER BY sim DESC; -- % = assez similaire
Les trigrammes (« bou », « oul », « ulo »âŠ) mesurent la similaritĂ© de chaĂźne â c'est ce qui attrape « bulon »â« boulon » que le full-text rate (il exige des lemmes corrects). L'index GIN trigram rend ça rapide.
pgvector : la recherche sémantique
CREATE EXTENSION vector;
ALTER TABLE variant ADD COLUMN search_vec vector(1024); -- embedding Cohere
CREATE INDEX ON variant USING hnsw (search_vec vector_cosine_ops);
SELECT * FROM variant ORDER BY search_vec <=> :embedding LIMIT 10; -- <=> = distance cosinus
<=> (cosinus), <-> (L2), <#> (produit interne) : les opĂ©rateurs de distance. L'index HNSW (graphe de voisinage) rend le plus-proche-voisin quasi instantanĂ© sur des millions de vecteurs â le « WHERE indexĂ© de l'espace sĂ©mantique » du cours ML.
Le fil conducteur
Chaque extension attrape ce que les autres ratent : full-text = les mots exacts (pluriels inclus), trigram = les fautes, vecteur = le sens. Les fusionner par RRF (cours Stack IA) donne une recherche robuste â et le fait que tout vive dans la mĂȘme base signifie : une seule requĂȘte, la RLS qui s'applique partout, zĂ©ro pipeline de synchro vers Elasticsearch/Pinecone. Postgres monte en gamme jusqu'Ă ce que le volume justifie (peut-ĂȘtre) un moteur dĂ©diĂ© â et ce moment arrive bien plus tard qu'on ne le croit.
Ce que pg_trgm attrape et que le full-text rate :