Полнотекстовый поиск в PostgreSQL: когда ILIKE уже не тянет
Часто разработчики в PostgreSQL начинают с простого:
SELECT * FROM articles WHERE title ILIKE '%postgres%';
Но уже при 10k+ строк и регулярных запросах начинаются тормоза. Значит, пора на следующий уровень — полнотекстовый поиск.
🔍 Когда ILIKE — плохо:
– Сложные запросы с несколькими ILIKE
– Не масштабируется: без индексов → full scan
– Нет нормализации слов: postgres, PostgreSQL, постгрес — всё разное
💡 Решение: to_tsvector + to_tsquery
SELECT * FROM articles
WHERE to_tsvector('russian', title) @@ to_tsquery('russian', 'postgres');
📈 Плюсы:
– Работают GIN-индексы
– Поддержка морфологии и синонимов
– Быстрее и точнее на больших объемах
⚠️ Подводные камни:
– Нужна настройка языкового словаря
– tsquery не такая гибкая, как regex
– Требуется обновление индекса при INSERT/UPDATE
🛠 Как включить GIN-индекс:
CREATE INDEX idx_articles_title_search
ON articles USING GIN (to_tsvector('russian', title));
👉 Если пользователи ищут по тексту — не тормозите ILIKE, внедряйте полнотекст!
Сохрани, чтобы потом не мучиться с explain-ами 😉
#db
👉 @database_info