Полнотекстовый поиск Postgresql соответствует соседним словам, но я хочу найти точное слово в большой таблице содержимого (тысячи слов в сотнях тысяч строк). Мой поиск должен быть очень быстрым (менее секунды). Использование like или ilike означает замедление (с 200 000 слов: более 5 секунд). У кого-нибудь есть вопрос, чтобы посоветовать мне?
полнотекстовый поиск по точному слову postgresql
comment
Пожалуйста, объясните, почему полнотекстовый поиск PostgreSQL не отвечает всем требованиям.
- person Laurenz Albe   schedule 28.06.2018
comment
потому что, например, если я ищу служащего, полнотекстовый поиск postgresql также соответствует серверу, но в моем случае я хочу, чтобы postgresql соответствовал только точному слову служанка, а не соседним словам, таким как сервер или другое.
- person Mike.S   schedule 29.06.2018
comment
О, это просто. Просто используйте словарь, который не использует корень.
- person Laurenz Albe   schedule 29.06.2018
comment
Как я могу это сделать? у тебя есть пример? Я использую французский словарь, но английский словарь с хорошим объяснением мог бы мне помочь.
- person Mike.S   schedule 02.07.2018
comment
У меня есть собственный словарь с использованием этой статьи, некоторые адаптации shisaa.jp/ postset/postgresql-полнотекстовый-поиск-часть-2.html
- person Mike.S   schedule 02.07.2018
Ответы (1)
Вы сможете решить проблему с полнотекстовым поиском 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)
person
Laurenz Albe
schedule
02.07.2018