Recherche plein texte
AvancéPostgreSQL intègre un moteur de recherche textuelle : normalisation, radicalisation (stemming), classement par pertinence, et index dédié.
-- Vecteur de recherche calculé automatiquement (colonne générée) + index GIN
ALTER TABLE articles
ADD COLUMN recherche tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('french', coalesce(titre, '')), 'A') ||
setweight(to_tsvector('french', coalesce(contenu, '')), 'B')
) STORED;
CREATE INDEX articles_recherche_idx ON articles USING gin (recherche);
SELECT id, titre, ts_rank(recherche, q) AS score
FROM articles, websearch_to_tsquery('french', 'index "plan d''exécution"') AS q
WHERE recherche @@ q
ORDER BY score DESC
LIMIT 10;
Ce qu'il faut retenir#
to_tsvector('french', texte)normalise le texte (minuscules, suppression des mots vides, racines).websearch_to_tsqueryaccepte une syntaxe proche de celle des moteurs de recherche (guillemets,-exclusion,or).setweightdonne plus de poids au titre qu'au corps du texte.pg_trgmcomplète : recherche approximative (similarity, fautes de frappe),LIKE '%…%'.
Astuce : pour un catalogue ou une documentation de taille raisonnable, la recherche plein texte de PostgreSQL évite d'ajouter Elasticsearch : moins d'infrastructure, une seule source de vérité et des transactions cohérentes. Au-delà (relevance très fine, facettes, très gros volumes), un moteur dédié devient pertinent.