AdvancedAdvanced PostgreSQL

Full-text search with ranking and highlighting

The query

SQL
-- Add tsvector column for performance
ALTER TABLE products ADD COLUMN search_vec TSVECTOR;

UPDATE products SET search_vec =
  TO_TSVECTOR('english', COALESCE(name,'') || ' ' || COALESCE(description,''));

CREATE INDEX idx_product_fts ON products USING GIN(search_vec);

-- Create trigger to keep it updated
CREATE TRIGGER tsvector_update BEFORE INSERT OR UPDATE ON products
  FOR EACH ROW EXECUTE FUNCTION
    TSVECTOR_UPDATE_TRIGGER(search_vec, 'pg_catalog.english', name, description);

-- Full text search with ranking and highlights
SELECT
  name,
  TS_RANK(search_vec, query) AS relevance,
  TS_HEADLINE('english', name, query, 'StartSel=<b>, StopSel=</b>') AS highlighted
FROM products, TO_TSQUERY('english', 'wireless & bluetooth | earphone') query
WHERE search_vec @@ query
ORDER BY relevance DESC;
Tested against PostgreSQL 16

Note

Full-text search pipeline: tsvector column + GIN index + trigger for auto-update + TS_RANK for relevance + TS_HEADLINE for highlighting.

Tables referenced