Sommaire
Une base documentaire interne grossit vite, et la recherche par LIKE devient lente et approximative. PostgreSQL sait indexer le texte, ignorer les accents et classer les résultats, sans service de plus à exploiter.
Un document, un vecteur de recherche
Une colonne générée garde la version indexable du titre et du contenu, pondérée pour qu’un mot du titre compte davantage :
ALTER TABLE document ADD COLUMN search tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('french', unaccent(title)), 'A') ||
setweight(to_tsvector('french', unaccent(body)), 'B')
) STORED;
CREATE INDEX document_search ON document USING gin (search);Les droits d’accès dans la requête
Filtrer après la recherche fuit des informations : le nombre de résultats ou un extrait suffisent à trahir un document confidentiel. Le filtre fait partie de la requête.
SELECT id, title, ts_headline('french', body, query) AS excerpt
FROM document, websearch_to_tsquery('french', unaccent($2)) AS query
WHERE group_id = ANY($1) AND search @@ query
ORDER BY ts_rank(search, query) DESC
LIMIT 20;
Quand passer à autre chose
- La tolérance aux fautes de frappe devient indispensable
- Les facettes et les agrégations se multiplient
- La recherche doit couvrir plusieurs bases
Le meilleur moteur de recherche est souvent celui que l’on exploite déjà.
- #PostgreSQL
- #API



