Ranking with ts_rank helps you find and order text search results by how well they match your search words.
Ranking with ts_rank in PostgreSQL
ts_rank(vector, query [, weights])
vector is a special text search vector made from your text data.
query is the search phrase turned into a text search query.
SELECT ts_rank(to_tsvector('english', 'PostgreSQL tutorial'), to_tsquery('english', 'PostgreSQL')) AS rank;
SELECT ts_rank(to_tsvector('english', 'Learn SQL and databases'), to_tsquery('english', 'SQL & databases')) AS rank;
This example creates a table of articles, inserts some sample data, and then searches the body text for 'SQL' and 'database'. It ranks the articles by how well they match and shows the best matches first.
CREATE TABLE articles (id SERIAL PRIMARY KEY, title TEXT, body TEXT); INSERT INTO articles (title, body) VALUES ('PostgreSQL Basics', 'Learn the basics of PostgreSQL database.'), ('Advanced SQL', 'Deep dive into SQL queries and optimization.'), ('Database Tutorial', 'Tutorial on databases and SQL.'); SELECT id, title, ts_rank(to_tsvector('english', body), to_tsquery('english', 'SQL & database')) AS rank FROM articles WHERE to_tsvector('english', body) @@ to_tsquery('english', 'SQL & database') ORDER BY rank DESC;
The ts_rank function returns a number showing match quality; it is not limited to between 0 and 1.
Higher rank means better match.
You can use weights to give more importance to some words.
ts_rank helps order search results by relevance.
Use to_tsvector to prepare text and to_tsquery for search terms.
Sort results by ts_rank to show best matches first.
Practice
ts_rank function do in PostgreSQL full-text search?Solution
Step 1: Understand the purpose of ts_rank
Thets_rankfunction scores how well a document matches a search query in full-text search.Step 2: Differentiate from related functions
to_tsvectorprepares text,to_tsquerycreates queries, butts_rankranks results.Final Answer:
It calculates the relevance ranking of a document for a search query. -> Option CQuick Check:
ts_rank = relevance score [OK]
- Confusing ts_rank with to_tsvector
- Thinking ts_rank creates search queries
- Assuming ts_rank sorts alphabetically
ts_rank in PostgreSQL?Solution
Step 1: Check correct function arguments
ts_rankrequires a tsvector and a tsquery, soto_tsvector(text_column)andto_tsquery('search')are correct.Step 2: Verify ordering and syntax
Ordering by rank descending shows best matches first, matching SELECT *, ts_rank(to_tsvector(text_column), to_tsquery('search')) AS rank FROM table ORDER BY rank DESC;.Final Answer:
SELECT *, ts_rank(to_tsvector(text_column), to_tsquery('search')) AS rank FROM table ORDER BY rank DESC; -> Option AQuick Check:
Correct ts_rank syntax = SELECT *, ts_rank(to_tsvector(text_column), to_tsquery('search')) AS rank FROM table ORDER BY rank DESC; [OK]
- Swapping to_tsvector and to_tsquery arguments
- Ordering results ascending instead of descending
- Passing plain text instead of tsvector or tsquery
documents with column content, what will this query return?SELECT content, ts_rank(to_tsvector(content), to_tsquery('cat & dog')) AS rank FROM documents ORDER BY rank DESC LIMIT 2;Solution
Step 1: Understand the query components
The query usesto_tsquery('cat & dog')which searches for documents containing both 'cat' and 'dog'.Step 2: Analyze ordering and limit
Results are ordered byts_rankdescending, so highest relevance first, limited to 2 rows.Final Answer:
The two documents with the highest relevance to both 'cat' and 'dog'. -> Option BQuick Check:
ts_rank orders best matches first [OK]
- Thinking it returns documents with either word
- Assuming alphabetical order instead of rank
- Believing LIMIT causes an error with ts_rank
SELECT content, ts_rank(to_tsquery(content), to_tsvector('search')) AS rank FROM documents ORDER BY rank DESC;Solution
Step 1: Check ts_rank argument order
ts_rankexpectstsvectorfirst, thentsquery. Here, they are reversed.Step 2: Confirm argument types
to_tsquery(content)is incorrect becausecontentis text, not a query string; alsoto_tsvector('search')is a vector, but arguments are swapped.Final Answer:
Arguments to ts_rank are reversed; tsvector should be first, tsquery second. -> Option AQuick Check:
ts_rank(tsvector, tsquery) order matters [OK]
- Swapping ts_rank arguments
- Using to_tsquery on text column
- Ignoring argument types for ts_rank
ts_rank with weights to achieve this?Solution
Step 1: Understand weighting with setweight
Usingsetweightwith 'A' assigns highest weight to terms into_tsvector, boosting the relevance of matching terms.Step 2: Analyze the query logic
to_tsquery('apple | orange')searches for either word, and ordering by rank descending with LIMIT 3 returns top 3 relevant documents.Step 3: Compare options
SELECT content, ts_rank(to_tsvector(content), to_tsquery('apple & orange')) AS rank FROM documents ORDER BY rank DESC LIMIT 3; uses AND (&) which requires both words, not either. SELECT content, ts_rank(to_tsvector(content), to_tsquery('apple | orange')) AS rank FROM documents ORDER BY rank ASC LIMIT 3; orders ascending, showing least relevant first. SELECT content, ts_rank(setweight(to_tsvector(content), 'D'), to_tsquery('apple | orange')) AS rank FROM documents ORDER BY rank ASC LIMIT 3; uses weight 'D' which is lowest, so it does not boost relevance as much.Final Answer:
SELECT content, ts_rank(setweight(to_tsvector(content), 'A'), to_tsquery('apple | orange')) AS rank FROM documents ORDER BY rank DESC LIMIT 3; -> Option DQuick Check:
Weighted ts_rank with OR query = SELECT content, ts_rank(setweight(to_tsvector(content), 'A'), to_tsquery('apple | orange')) AS rank FROM documents ORDER BY rank DESC LIMIT 3; [OK]
- Using AND instead of OR in tsquery
- Ordering by rank ascending instead of descending
- Assigning lowest weight to preferred terms
Ready to prove it?
Pass the test and this pattern moves unknown
