Как понять, что вашему проекту нужен полнотекстовый поиск, а не ILIKE

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
10,005
Реакции
1,564
Credits
35,671
Как понять, что вашему проекту нужен полнотекстовый поиск, а не ILIKE

Часто разработчики в PostgreSQL начинают с простого:
SQL:
SELECT * FROM articles WHERE title ILIKE '%postgres%';
Но уже при 10k+ строк и регулярных запросах начинаются тормоза. Значит, пора на следующий уровень — полнотекстовый поиск.

Когда ILIKE — плохо:
– Сложные запросы с несколькими ILIKE
– Не масштабируется: без индексов → full scan
– Нет нормализации слов: postgres, PostgreSQL, постгрес — всё разное

Решение:
to_tsvector + to_tsquery
SQL:
SELECT * FROM articles
WHERE to_tsvector('russian', title) @@ to_tsquery('russian', 'postgres');

Плюсы:
– Работают GIN-индексы
– Поддержка морфологии и синонимов
– Быстрее и точнее на больших объемах

Подводные камни:
– Нужна настройка языкового словаря
– tsquery не такая гибкая, как regex
– Требуется обновление индекса при INSERT/UPDATE

Как включить GIN-индекс:
SQL:
CREATE INDEX idx_articles_title_search
ON articles USING GIN (to_tsvector('russian', title));

Если пользователи ищут по тексту — не тормозите ILIKE, внедряйте полнотекст!