Recherche en texte intégral avec tsvector et GIN
Créez une recherche en texte intégral prête pour la production avec des colonnes tsvector, des index GIN et des dictionnaires de recherche configurables.
Recherche en texte intégral avec tsvector et GIN est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.
Au-delà des sous-chaînes : recherche tenant compte des mots
La recherche en texte intégral (FTS) comprend les mots : racinisation, mots vides et classement. PostgreSQL l'intègre via les types tsvector / tsquery.
Construire un tsvector
Analyser un document :
SELECT to_tsvector('english', 'The quick brown foxes jumped over');
-- 'brown':3 'fox':4 'jump':5 'quick':2Construire un tsquery
Analyser une requête :
SELECT to_tsquery('english', 'fox & jumping'); -- 'fox' & 'jump'
SELECT websearch_to_tsquery('english', 'fox jumping -lazy');Correspondance : @@
Tester un document par rapport à une requête :
SELECT 'fox jumping'::tsvector @@ 'fox & jump'::tsquery; -- tIndexer pour la FTS
Ajouter une colonne tsvector et un index GIN :
ALTER TABLE articles
ADD COLUMN search_doc tsvector
GENERATED ALWAYS AS (
to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,''))
) STORED;
CREATE INDEX articles_search_idx ON articles USING GIN (search_doc);Interroger
Recherche filtrée rapide :
SELECT id, title FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', 'postgres performance')
ORDER BY ts_rank(search_doc, websearch_to_tsquery('english', 'postgres performance')) DESC
LIMIT 20;Classement avec ts_rank
ts_rank évalue les résultats selon la fréquence et la position des mots. ts_rank_cd utilise la densité de couverture (en tenant compte de la position) :
SELECT id, ts_rank_cd(search_doc, q) AS rank
FROM articles, websearch_to_tsquery('english', $1) AS q
WHERE search_doc @@ q
ORDER BY rank DESC LIMIT 20;Extraits avec ts_headline
Afficher les fragments correspondants en mettant en évidence les mots trouvés :
SELECT ts_headline('english', body,
websearch_to_tsquery('english', $1),
'StartSel=<mark>, StopSel=</mark>, MaxFragments=2')
FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', $1);Recherche par phrase
Rechercher des mots adjacents :
SELECT * FROM articles
WHERE search_doc @@ phraseto_tsquery('english', 'database performance');Pondérations de plusieurs champs
Donner plus de poids au titre qu'au corps avec setweight :
ALTER TABLE articles
ADD COLUMN search_doc tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(title,'')), 'A') ||
setweight(to_tsvector('english', coalesce(body,'')), 'B')
) STORED;Configuration de la langue
La configuration english définit les mots vides, la racinisation, etc. PostgreSQL est fourni avec de nombreuses langues ; changez de langue selon les besoins :
SELECT to_tsvector('turkish', 'Veritabanı performansı');Limites de la FTS intégrée
Adaptée aux langues proches de l'anglais, avec un classement élémentaire. Pour des besoins plus avancés (BM25, représentations vectorielles, recherche à facettes), envisagez Elasticsearch ou OpenSearch en complément de Postgres.
Récapitulatif
La FTS de PostgreSQL constitue une solution par défaut compétente.
- Correspondance avec tsvector + tsquery + @@
- Index GIN pour accélérer les recherches
- websearch_to_tsquery pour les saisies humaines
- ts_rank/ts_headline pour des résultats classés et mis en évidence
Vérification rapide
Vous devez filtrer rapidement des articles à l'aide d'une requête en texte intégral. Quel index choisir ?
Questions Fréquemment Posées
La leçon « Recherche en texte intégral avec tsvector et GIN » est-elle gratuite ?
Oui — le texte complet de « Recherche en texte intégral avec tsvector et GIN » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Recherche en texte intégral avec tsvector et GIN » ?
Créez une recherche en texte intégral prête pour la production avec des colonnes tsvector, des index GIN et des dictionnaires de recherche configurables. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer SQL Academy ?
Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Recherche en texte intégral avec tsvector et GIN » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?
Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Recherche par trigrammes (pg_trgm) pour la correspondance approximative
- Recherche en texte intégral avec tsvector et GIN
- Indexation géospatiale avec PostGIS
- Recherche vectorielle avec pgvector