Use to_tsvector to convert text into searchable form.
Use to_tsquery to create the search query.
Examples
Finds all articles where the word 'database' appears in the content.
PostgreSQL
SELECT * FROM articles WHERE to_tsvector(content) @@ to_tsquery('database');
Finds reviews containing both 'fast' and 'reliable'.
PostgreSQL
SELECT * FROM reviews WHERE to_tsvector(comment) @@ to_tsquery('fast & reliable');
Finds emails containing either 'urgent' or 'important'.
PostgreSQL
SELECT * FROM emails WHERE to_tsvector(body) @@ to_tsquery('urgent | important');
Sample Program
This example creates a books table, adds some books, and searches for books whose description contains both 'SQL' and 'speed'.
PostgreSQL
CREATETABLE books (id SERIALPRIMARYKEY, title TEXT, description TEXT);
INSERTINTO books (title, description) VALUES
('Learn SQL', 'A book about learning SQL databases'),
('Cooking Tips', 'Tips and tricks for cooking delicious meals'),
('SQL Performance', 'How to optimize SQL queries for speed');
SELECT title FROM books WHERE to_tsvector(description) @@ to_tsquery('SQL & speed');
OutputSuccess
Important Notes
Full-text search is faster than using LIKE for big text data.
It ignores common words like 'the' or 'and' to focus on important words.
You can combine words with AND (&), OR (|), and NOT (!) in to_tsquery.
Summary
Full-text search helps find words inside large text quickly.
Use to_tsvector and to_tsquery to search text columns.
It works well for searching articles, reviews, emails, and more.
Practice
(1/5)
1. Why is full-text search important in PostgreSQL?
easy
A. It automatically corrects spelling mistakes in queries.
B. It allows fast searching of words inside large text columns.
C. It stores data in encrypted form for security.
D. It creates backups of the database automatically.
Solution
Step 1: Understand full-text search purpose
Full-text search is designed to quickly find words or phrases inside large text fields.
Step 2: Compare options to purpose
Only It allows fast searching of words inside large text columns. describes this purpose correctly; others describe unrelated features.
Final Answer:
It allows fast searching of words inside large text columns. -> Option B
Quick Check:
Full-text search = fast word search [OK]
Hint: Full-text search = fast word search in big text [OK]
Common Mistakes:
Confusing full-text search with spell check
Thinking it encrypts data
Assuming it handles backups
2. Which of the following is the correct way to convert a text column for full-text search in PostgreSQL?
easy
A. SELECT to_tsvector('english', column_name) FROM table_name;
B. SELECT to_tsquery('english', column_name) FROM table_name;
C. SELECT to_tsvector(column_name) FROM table_name;
D. SELECT to_tsquery(column_name) FROM table_name;
Solution
Step 1: Identify function for text vector conversion
to_tsvector converts text into a searchable document vector; it requires a configuration like 'english'.
Step 2: Check syntax correctness
SELECT to_tsvector('english', column_name) FROM table_name; uses to_tsvector with language and column, which is correct syntax.
Final Answer:
SELECT to_tsvector('english', column_name) FROM table_name; -> Option A
Quick Check:
to_tsvector needs language + text [OK]
Hint: Use to_tsvector('language', text) to prepare text [OK]
Common Mistakes:
Using to_tsquery instead of to_tsvector for conversion
Omitting language configuration
Passing wrong argument order
3. Given the table articles with a column content, what will this query return?
SELECT id FROM articles WHERE to_tsvector('english', content) @@ to_tsquery('english', 'database & search');
medium
A. Syntax error due to incorrect query.
B. All article IDs where content contains either 'database' or 'search'.
C. All article IDs where content contains the exact phrase 'database search'.
D. All article IDs where content contains both 'database' and 'search'.
Solution
Step 1: Understand the @@ operator
The @@ operator checks if the text vector matches the text query.
Step 2: Interpret the query string 'database & search'
The '&' means AND, so both words must be present in the content.
Final Answer:
All article IDs where content contains both 'database' and 'search'. -> Option D
Quick Check:
'&' means AND in to_tsquery [OK]
Hint: Use '&' in to_tsquery for AND condition [OK]
Common Mistakes:
Thinking '&' means OR
Assuming phrase match instead of word match
Believing query causes syntax error
4. You wrote this query but it returns no rows:
SELECT * FROM emails WHERE to_tsvector('english', body) @@ to_tsquery('english', 'urgent | meeting');
What is the most likely reason?
medium
A. The body column is NULL in all rows.
B. The to_tsquery syntax is incorrect; '|' is not valid.
C. The query searches for 'urgent' OR 'meeting', but none exist in body.
D. to_tsvector cannot be used on text columns.
Solution
Step 1: Understand the query logic
The '|' operator means OR, so it matches rows containing 'urgent' or 'meeting'.
Step 2: Analyze why no rows return
If no rows match, likely none contain these words in the body column.
Final Answer:
The query searches for 'urgent' OR 'meeting', but none exist in body. -> Option C
Quick Check:
'|' means OR; no matches means words missing [OK]
Hint: Check if searched words exist in text before blaming syntax [OK]
Common Mistakes:
Thinking '|' is invalid syntax
Assuming to_tsvector can't be used on text
Ignoring possibility of no matching data
5. You want to find articles that mention either 'database' or 'search' but NOT 'slow'. Which query correctly does this using full-text search?
hard
A. SELECT id FROM articles WHERE to_tsvector('english', content) @@ to_tsquery('english', '(database | search) & !slow');
B. SELECT id FROM articles WHERE to_tsvector('english', content) @@ to_tsquery('english', 'database | (search & !slow)');
C. SELECT id FROM articles WHERE to_tsvector('english', content) @@ to_tsquery('english', 'database | search & !slow');
D. SELECT id FROM articles WHERE to_tsvector('english', content) @@ to_tsquery('english', 'database & search & !slow');
Solution
Step 1: Understand operator precedence in to_tsquery
AND (&) has higher precedence than OR (|), so parentheses are needed to group OR terms.
Step 2: Analyze each option
SELECT id FROM articles WHERE to_tsvector('english', content) @@ to_tsquery('english', '(database | search) & !slow'); correctly groups 'database | search' together, then AND NOT 'slow'. Others either miss grouping or change logic.
Final Answer:
SELECT id FROM articles WHERE to_tsvector('english', content) @@ to_tsquery('english', '(database | search) & !slow'); -> Option A
Quick Check:
Use parentheses to group OR before AND NOT [OK]
Hint: Group OR terms with parentheses before AND/NOT [OK]
Common Mistakes:
Missing parentheses causing wrong logic
Using AND instead of OR for 'database' or 'search'
Placing NOT operator incorrectly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.