Full Text Search With PostgreSQL
In addition to what @swasheck already explained, you'll probably get better performance with LIKE
(~~
) and ILIKE
(~~*
) in combination with a trigram GiST or GIN index. You'll have to install the additional module pg_trgm for that. Find details under these related questions:
- How is LIKE implemented?
- Pattern matching with LIKE, SIMILAR TO or regular expressions in PostgreSQL
Trigram indexes can be used for basic regular expression matches (~
) as well, but LIKE
is generally faster.
Create an index like:
CREATE INDEX stickers_title_gin_trgm_idx ON stickers
USING gin (title gin_trgm_ops);
Then this should be very fast:
SELECT *
FROM stickers
WHERE title ~~* '%case 580%';
Or (not clear from your question):
SELECT *
FROM stickers
WHERE title ~~* '%case%'
AND title ~~ '%580%';
This is not really a use case for full text search because full text relies on stemming the text and parsing the chunks into tokens. As you can see from keywords
, '580h' is parsed as its own word because there's no language in which '580' is a "stem" of '580h'. You'd probably be better off with regular expression matching.
Here's a query that I worked up for you:
SELECT id, title
FROM stickers WHERE
(title ~* '580')
AND
(title ~* 'case')
ORDER BY id
SELECT
*
FROM
stickers
WHERE
keywords @@ to_tsquery('case & 580:*')
will work.
Postgres text search allows for prefix searching, which is represented by the :* in the query. It will match any token starting with 580