PostgreSQL
Beginner
1 min read
Full-Text Search
Example
-- Add a generated tsvector column for fast FTS
ALTER TABLE articles ADD COLUMN search_vector TSVECTOR
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
setweight(to_tsvector('english', coalesce(body, '')), 'B')
) STORED;
-- GIN index on the generated column
CREATE INDEX idx_articles_fts ON articles USING GIN (search_vector);
-- Full-text search with ranking
SELECT
id, title,
ts_rank(search_vector, query) AS rank
FROM articles, to_tsquery('english', 'postgresql & performance') AS query
WHERE search_vector @@ query
ORDER BY rank DESC
LIMIT 10;
-- plainto_tsquery — no special operator syntax needed
SELECT title FROM articles
WHERE search_vector @@ plainto_tsquery('english', 'index performance');
-- websearch_to_tsquery — Google-style search syntax
SELECT title FROM articles
WHERE search_vector @@ websearch_to_tsquery('english', 'postgresql -mysql');
-- Highlight matching terms
SELECT
title,
ts_headline('english', body, to_tsquery('postgresql'), 'MaxFragments=2') AS excerpt
FROM articles
WHERE search_vector @@ to_tsquery('postgresql');
Related Resources
PostgreSQL Reference
Complete tag & property list
PostgreSQL How-To Guides
Step-by-step practical guides
PostgreSQL Exercises
Practice what you've learned
More in PostgreSQL