Я использую большой словарь синонимов в postgres 11
для полнотекстового поиска, и он очень медленный (~ 1.6с).В базе данных ~ 150 строк.Такая же продолжительность только для одного ряда.
Словарь содержит ~ 600 000 синонимов.
Запрос такой:
SELECT id, ts_rank(index_full, to_tsquery('ro', :searchTerm)) as relevance
FROM asistent
WHERE index_full @@ to_tsquery('ro', :searchTerm)
ORDER BY relevance
DESC LIMIT 100
Существует индекс GIN
для index_full
:
CREATE INDEX pgweb_idx_full
ON public.asistent
USING gin
(index_full);
но запрос медленный даже с одной строкой в таблице, поэтому индекс не является проблемой.
Запросы, которые я использовал для создания / использования словаря (dex
в запросах) это:
CREATE EXTENSION unaccent;
CREATE TEXT SEARCH DICTIONARY ro (
TEMPLATE = pg_catalog.simple,
STOPWORDS = romanian
);
CREATE TEXT SEARCH DICTIONARY dex (
TEMPLATE = synonym,
SYNONYMS = dex
);
CREATE TEXT SEARCH CONFIGURATION RO (COPY = romanian);
ALTER TEXT SEARCH CONFIGURATION RO
ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word
WITH unaccent, dex, ro;
Мне нужно было использовать пользовательский словарь, потому что использование словаря румынского языка по умолчанию дает недопустимые результаты.Есть много слов с разными лексемами для форм единственного и множественного числа.
Как я могу сделать запросы, использующие словарь быстрее?