The @@ operator helps you quickly find rows where text matches a search query using full-text search.
@@ match operator in PostgreSQL
tsvector_column @@ to_tsquery('search_query')tsvector_column holds searchable text in a special format.
to_tsquery('search_query') converts your search words into a query format.
content_vector @@ to_tsquery('cat & dog')content_vector @@ to_tsquery('cat | dog')content_vector @@ to_tsquery('cat:*')This creates a table with articles, stores searchable text in content_vector, inserts three articles, then finds articles mentioning 'dog'.
CREATE TABLE articles ( id SERIAL PRIMARY KEY, title TEXT, body TEXT, content_vector tsvector ); INSERT INTO articles (title, body, content_vector) VALUES ('Cats and Dogs', 'Cats and dogs are common pets.', to_tsvector('Cats and dogs are common pets.')), ('Bird Watching', 'Birds are beautiful creatures.', to_tsvector('Birds are beautiful creatures.')), ('Dog Training', 'Training your dog is important.', to_tsvector('Training your dog is important.')); SELECT id, title FROM articles WHERE content_vector @@ to_tsquery('dog');
Make sure to update the tsvector column when text changes.
The @@ operator is fast when you create an index on the tsvector column.
The @@ operator matches text columns against search queries.
Use to_tsquery() to build your search terms.
This helps build powerful text search features in PostgreSQL.
Practice
What does the @@ operator do in PostgreSQL?
Solution
Step 1: Understand the purpose of
The@@operator@@operator is used in PostgreSQL for full-text search to match text columns against search queries.Step 2: Compare with other options
Other options describe unrelated operations like numeric comparison, string concatenation, or NULL checks, which are not related to@@.Final Answer:
It matches a text column against a full-text search query. -> Option CQuick Check:
@@= full-text match [OK]
- Confusing @@ with equality operator =
- Thinking @@ concatenates strings
- Assuming @@ checks for NULL
Which of the following is the correct syntax to use the @@ operator with to_tsquery in PostgreSQL?
SELECT * FROM articles WHERE content @@ to_tsquery('search_term');Solution
Step 1: Identify correct usage of
The@@withto_tsquery@@operator requires the right side to be a tsquery, which is created byto_tsquery().Step 2: Check each option
SELECT * FROM articles WHERE content @@ to_tsquery('search_term'); correctly usescontent @@ to_tsquery('search_term'). Options B, C, and D misuse operators or omitto_tsquery().Final Answer:
SELECT * FROM articles WHERE content @@ to_tsquery('search_term'); -> Option AQuick Check:
Use@@ to_tsquery()syntax [OK]
- Using = instead of @@
- Passing plain string without to_tsquery()
- Using LIKE operator for full-text search
Given the table documents with a text_content column, what will this query return?
SELECT id FROM documents WHERE text_content @@ to_tsquery('cat & dog');Assuming the table has these rows:
- 1: 'The cat chased the dog.'
- 2: 'A dog and a cat are friends.'
- 3: 'The cat is sleeping.'
Solution
Step 1: Understand the query condition
The query usesto_tsquery('cat & dog'), which means both 'cat' AND 'dog' must be present intext_content.Step 2: Check each row for both words
Row 1 has 'cat' and 'dog'. Row 2 has both words as well. Row 3 only has 'cat', missing 'dog'.Final Answer:
[1, 2] -> Option BQuick Check:
AND search returns rows with both terms [OK]
- Assuming OR instead of AND with &
- Expecting rows missing one word to match
- Confusing to_tsquery syntax
Identify the error in this query:
SELECT * FROM posts WHERE content @@ 'cat | dog';
Solution
Step 1: Check the right side of @@ operator
The right side must be a tsquery type, usually created byto_tsquery(). Here, it's a plain string.Step 2: Identify the missing function
The query should becontent @@ to_tsquery('cat | dog')to be valid.Final Answer:
Missing to_tsquery() function around the search string. -> Option DQuick Check:
Right side of @@ needs to_tsquery() [OK]
- Using plain string without to_tsquery()
- Thinking | operator is invalid inside to_tsquery
- Confusing @@ with LIKE
You want to find all rows in messages where the body contains either 'error' or 'failure' but not both. Which to_tsquery expression with @@ operator will achieve this?
Solution
Step 1: Understand the requirement
We want rows containing 'error' or 'failure' but NOT both. This is an exclusive OR (XOR) condition.Step 2: Analyze the options
body @@ to_tsquery('(error | failure) & !(error & failure)') uses(error | failure) & !(error & failure), which means 'error or failure' AND NOT 'both error and failure'. This matches XOR logic.Step 3: Check other options
body @@ to_tsquery('error | failure & !error & !failure') is invalid syntax. body @@ to_tsquery('error | failure') matches any with 'error' or 'failure' including both. body @@ to_tsquery('error <-> failure') looks for 'error' immediately followed by 'failure'.Final Answer:
body @@ to_tsquery('(error | failure) & !(error & failure)') -> Option AQuick Check:
XOR = (A OR B) AND NOT (A AND B) [OK]
- Using simple OR instead of XOR
- Incorrect syntax for NOT operator
- Confusing proximity operator <-> with XOR
Ready to prove it?
Pass the test and this pattern moves unknown
