Практика: Полнотекстовый поиск и текстовые данные
Онлайн редактор кода для PostgreSQL
Здесь вы можете попробовать свои силы в программировании на языке SQL для работы с PostgreSQL. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.
❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.
Задание 1 — Базовый полнотекстовый поиск
Задание 1: Простой поиск + tsquery + разные операторы
⏱️ Примерное время: 15-25 минутСоздай таблицу статей/постов и напиши поисковые запросы с разными операторами.
Требования:
- создай таблицу
articlesс полемsearch_vector tsvector - хотя бы один триггер или функция для автоматического обновления tsvector
- минимум 4 разных варианта запроса (с
&,|,!,<->,<N>) - используй
to_tsquery,plainto_tsquery,phraseto_tsquery,websearch_to_tsquery
Пример:
SELECT title, ts_rank(search_vector, query) AS rank
FROM articles, to_tsquery('russian', 'postgresql & оптимизация') query
WHERE search_vector @@ query
ORDER BY rank DESC
LIMIT 10;
Задание 2 — Ранжирование и подсветка
Задание 2: Ранжирование + ts_headline + веса
⏱️ Примерное время: 20-35 минутДобавь ранжирование и красивую подсветку результатов.
Требования:
- используй
ts_rank,ts_rank_cd - хотя бы один запрос с
setweight(A/B/C) - минимум 2 варианта
ts_headlineс разными настройками - красивое форматирование результата
Пример:
SELECT
title,
ts_headline('russian', content, query, 'StartSel=<mark>, StopSel=</mark>, MaxFragments=2') AS snippet,
ts_rank(search_vector, query, 1) AS rank
FROM articles, websearch_to_tsquery('russian', 'postgresql индекс') query
WHERE search_vector @@ query
ORDER BY rank DESC
LIMIT 5;
Задание 3 — Нечёткий поиск + триграммы + Levenshtein
Задание 3: Поиск с опечатками (pg_trgm, fuzzystrmatch)
⏱️ Примерное время: 25-40 минутРеализуй поиск, который прощает опечатки и находит похожие строки.
Требования:
- установи расширения
pg_trgmиfuzzystrmatch - создай GIN-индексы с
gin_trgm_ops - хотя бы один запрос с
similarity(),levenshtein(),% - комбинированный поиск (FTS + fuzzy)
Пример:
SELECT title, similarity(title, 'Оптимизация PostgreSQL') AS sim
FROM articles
WHERE title % 'Оптимизация PostgreSQL'
OR search_vector @@ to_tsquery('russian', 'оптимизация')
ORDER BY sim DESC
LIMIT 5;
Задание 4 — Продвинутые сценарии (автодополнение, многоязычность, логи)
Задание 4: Автодополнение, многоязычный поиск, поиск по логам
⏱️ Примерное время: 40-70 минутРеализуй реальные поисковые фичи.
Требования:
- функция поиска с параметрами (query, limit, offset, filters…)
- минимум один сценарий с автодополнением
- хотя бы один многоязычный пример или синонимы
- красивая функция + комментарии
Пример структуры функции:
CREATE FUNCTION search_articles(
q TEXT,
lim INT DEFAULT 10,
offs INT DEFAULT 0
) RETURNS TABLE(...) AS $$
...
$$ LANGUAGE sql STABLE;
Задание 5 — Итоговый поисковый движок
Задание 5: Полноценная поисковая система (итоговое)
⏱️ Примерное время: 90-180 минутСоздай мини-поисковик уровня блога / магазина / документации.
Требования:
- полноценная таблица + tsvector + GIN-индекс
- триггер для обновления search_vector
- функция поиска с ранжированием, подсветкой, пагинацией
- поддержка весов, синонимов, опечаток, фраз
- логирование запросов + автодополнение (бонус)
- красивая выдача: заголовок, сниппет, релевантность, метаданные
Это задание — отличный проект для портфолио или собеседования на позицию SQL-разработчика / аналитика / бэкендера.
Полнотекстовый поиск — это когда ты перестаёшь писать 15 условий LIKE и начинаешь думать как поисковая система.
Главные правила успеха:
- Отдельная колонка tsvector + GIN-индекс — обязательно
- websearch_to_tsquery — лучший друг пользовательского ввода
- ts_headline — делает результаты красивыми и понятными
- ts_rank + веса + нормализация = релевантные результаты
- pg_trgm + levenshtein = прощение опечаток