</>
Plan du cours — 37/64

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_tsquery accepte une syntaxe proche de celle des moteurs de recherche (guillemets, -exclusion, or).
  • setweight donne plus de poids au titre qu'au corps du texte.
  • pg_trgm complè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.