точное слово полнотекстовый поиск postgresql - PullRequest
0 голосов
/ 28 июня 2018

Полнотекстовый поиск Postgresql соответствует близким словам, но я хочу найти точное слово в большой таблице содержимого (тысячи слов в сотнях тысяч строк). Мой поиск должен быть очень быстрым (менее секунды). Использование like или ilike означает замедление (с 200000 слов: более 5 секунд). У кого-нибудь есть вопрос, чтобы посоветовать мне?

1 Ответ

0 голосов
/ 02 июля 2018

Вы сможете решить свою проблему с помощью полнотекстового поиска 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)
...