Full_text_search
Chapter 50: Full-Text Search
Section titled “Chapter 50: Full-Text Search”Searching Text Data
Section titled “Searching Text Data”50.1 Understanding Full-Text Search
Section titled “50.1 Understanding Full-Text Search”Full-text search allows you to search text data efficiently without scanning every row.
Full-Text Search Components ========================================================================
┌─────────────────────────────────────────────────────────────────────┐ │ FTS Components │ │ │ │ Text Search Configuration: │ │ ───────────────────────── │ │ • Defines how text is processed │ │ • Includes dictionary and tokenizer │ │ • english, simple, etc. │ │ │ │ tsvector: │ │ ───────── │ │ • Preprocessed indexed form of text │ │ • Lists lexemes with positions │ │ │ │ tsquery: │ │ ───────── │ │ • Query in optimized form │ │ • Supports boolean operators │ │ │ └─────────────────────────────────────────────────────────────────────┘50.2 Basic Full-Text Search
Section titled “50.2 Basic Full-Text Search”-- Enable extension (usually pre-installed)CREATE EXTENSION IF NOT EXISTS unaccent;
-- Create table for searchCREATE TABLE articles ( article_id SERIAL PRIMARY KEY, title VARCHAR(200), content TEXT, search_vector TSVECTOR);
-- Generate tsvector from columnsUPDATE articlesSET search_vector = setweight(to_tsvector('english', title), 'A') || setweight(to_tsvector('english', content), 'B');
-- Create GIN indexCREATE INDEX idx_articles_search ON articles USING GIN(search_vector);
-- Search using full-text searchSELECT title, ts_rank_cd(search_vector, query) as rankFROM articles, to_tsquery('english', 'postgresql & tutorial') queryWHERE search_vector @@ queryORDER BY rank DESC;50.3 Text Search Functions
Section titled “50.3 Text Search Functions”-- Convert text to tsvectorSELECT to_tsvector('english', 'PostgreSQL is a powerful database');
-- Create tsquerySELECT to_tsquery('english', 'postgresql & tutorial');
-- Search with @@SELECT * FROM articlesWHERE search_vector @@ to_tsquery('english', 'database');
-- Multiple words (any)SELECT * FROM articlesWHERE search_vector @@ to_tsquery('english', 'postgresql | mysql');
-- Phrase searchSELECT * FROM articlesWHERE search_vector @@ to_tsquery('english', 'database <-> tutorial');
-- Ranking resultsSELECT title, ts_rank_cd(search_vector, query) as rankFROM articles, to_tsquery('english', 'tutorial') queryWHERE search_vector @@ queryORDER BY rank DESC;50.4 Text Search Configuration
Section titled “50.4 Text Search Configuration”-- List available configurationsSELECT cfgname FROM pg_ts_config;
-- Use custom configurationSELECT to_tsvector('simple', 'PostgreSQL Tutorial');
-- Create custom text search configurationCREATE TEXT SEARCH CONFIGURATION my_config (COPY = english);
-- Add dictionary to configurationALTER TEXT SEARCH CONFIGURATION my_config ADD MAPPING FOR word WITH english_stem;
-- Use custom configurationSELECT to_tsvector('my_config', 'PostgreSQL Tutorial');50.5 Practical Examples
Section titled “50.5 Practical Examples”-- Search with highlightingSELECT title, ts_headline('english', content, to_tsquery('english', 'tutorial'), ts_rank_cd(search_vector, query) as rankFROM articles, to_tsquery('english', 'tutorial') queryWHERE search_vector @@ queryORDER BY rank DESC;
-- Combined searchSELECT * FROM articlesWHERE to_tsvector('english', title || ' ' || content) @@ to_tsquery('english', 'database & tutorial');
-- Phrase search with FTSSELECT * FROM articlesWHERE search_vector @@ phraseto_tsquery('english', 'full text search');Summary
Section titled “Summary”| Function | Purpose |
|---|---|
| to_tsvector | Create searchable index |
| to_tsquery | Create query |
| @@ | Match operator |
| ts_rank | Rank results |
This completes the PostgreSQL Guide!