Как понять, что вашему проекту нужен полнотекстовый поиск, а не ILIKE
Часто разработчики в PostgreSQL начинают с простого:
Но уже при 10k+ строк и регулярных запросах начинаются тормоза. Значит, пора на следующий уровень — полнотекстовый поиск.
Когда ILIKE — плохо:
– Сложные запросы с несколькими ILIKE
– Не масштабируется: без индексов → full scan
– Нет нормализации слов: postgres, PostgreSQL, постгрес — всё разное
Решение: to_tsvector + to_tsquery
Плюсы:
– Работают GIN-индексы
– Поддержка морфологии и синонимов
– Быстрее и точнее на больших объемах
Подводные камни:
– Нужна настройка языкового словаря
– tsquery не такая гибкая, как regex
– Требуется обновление индекса при INSERT/UPDATE
Как включить GIN-индекс:
Если пользователи ищут по тексту — не тормозите ILIKE, внедряйте полнотекст!
Часто разработчики в PostgreSQL начинают с простого:
SQL:
SELECT * FROM articles WHERE title ILIKE '%postgres%';
Когда 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, внедряйте полнотекст!