Вы сможете решить свою проблему с помощью полнотекстового поиска PostgreSQL, если будете использовать словарь simple
и создать соответствующий индекс GIN:
CREATE TABLE haystack (id serial PRIMARY KEY, string text NOT NULL);
INSERT INTO haystack (string) VALUES ('I am your servant');
INSERT INTO haystack (string) VALUES ('What use is a server without a client?');
CREATE INDEX haystack_fts_ind ON haystack USING gin (to_tsvector('simple', string));
Давайте отключим последовательное сканирование, чтобы индекс использовался, хотя пример таблицы слишком мал:
SET enable_seqscan=off;
Теперь найдены только точные совпадения, и не имеет места:
SELECT * FROM haystack
WHERE to_tsvector('simple', string) @@ to_tsquery('simple', 'servant');
id | string
----+-------------------
1 | I am your servant
(1 row)
Индекс можно использовать для ускорения запроса:
EXPLAIN (COSTS off) SELECT * FROM haystack
WHERE to_tsvector('simple', string) @@ to_tsquery('simple', 'servant');
QUERY PLAN
------------------------------------------------------------------------------------------
Bitmap Heap Scan on haystack
Recheck Cond: (to_tsvector('simple'::regconfig, string) @@ '''servant'''::tsquery)
-> Bitmap Index Scan on haystack_fts_ind
Index Cond: (to_tsvector('simple'::regconfig, string) @@ '''servant'''::tsquery)
(4 rows)