Aller au contenu
← Tous les articles

Backend1 min de lecture

Chercher dans sa documentation avec PostgreSQL

Avant d’ajouter un moteur de recherche à l’infrastructure, la recherche plein texte de PostgreSQL couvre souvent le besoin : accents, pertinence, droits d’accès.

Treillis de points lumineux sur un halo bleu profond
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 :

SQL
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.

SQL
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;
Colonnes de nœuds reliés par un maillage de fins traits bleus
Les couches de la recherche : droits, index, classement.

Quand passer à autre chose

  1. La tolérance aux fautes de frappe devient indispensable
  2. Les facettes et les agrégations se multiplient
  3. La recherche doit couvrir plusieurs bases
Le meilleur moteur de recherche est souvent celui que l’on exploite déjà.
  • #PostgreSQL
  • #API

Partager

Un projet, une question ?

Cet article vous a donné une idée, ou vous bloquez sur un problème proche ? Écrivez-moi, je réponds à chaque message.