36

I have a database and want to be able to look up in a table a search that's something like: select * from table where column like "abc%def%ghi" or select * from table where column like "%def%ghi" Is there a way to index the column so that this isn't too slow?

Edit: Can I also clarify that the database is read only and won't be updated often.

0

3 Answers 3

35

Options for text search and indexing include:

From the minimal information given above, I'd say that only a trigram index will be able to help you, since you're doing infix searches on a string and not looking for dictionary words. Unfortunately, trigram indexes are huge and rather inefficient; don't expect some kind of magical performance boost, and keep in mind that they take a lot of work for the database engine to build and keep up to date.

Sign up to request clarification or add additional context in comments.

2 Comments

The 'reverse()d index' refers to an index built on an expression, i.e. 'reverse(col)' in this case. I didn't realize this was possible. Another use case for this mechanism is case-insensitive search by indexing 'lower(col)'.
If the value has certain pattern, may have a look at this: stackoverflow.com/a/60389551/5172925
11

If you need just to, for instance, get unique substrings in an entire table, you can create a substring index:

CREATE INDEX  i_test_sbstr ON tablename (substring(columname, 5, 3)); 
-- start at position 5, go for 3 characters

It is important that the substring() parameters in the index definition are
the same as you use in your query.

ref: http://www.postgresql.org/message-id/[email protected]

Comments

8

For the like operator use one of the operator classes varchar_pattern_ops or text_pattern_ops

create index test_index on test_table (col varchar_pattern_ops);

That will only work if the pattern does not start with a % in which case another strategy is required.

1 Comment

If full-text searching is needed, pg_trgm might work. I've used it in the past and it works pretty well under certain conditions. It should be noted that the indexes get quite large. IIRC, about 2.5x the size of the indexed column.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.