Полнотекстовый поиск с tsvector и GIN
Создавайте полнотекстовый поиск для промышленных систем с помощью столбцов tsvector, индексов GIN и настраиваемых словарей текстового поиска
«Полнотекстовый поиск с tsvector и GIN» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
За пределами подстрок: поиск с учётом слов
Полнотекстовый поиск (FTS) понимает структуру слов: нормализацию, стоп-слова и ранжирование. В PostgreSQL он встроен через типы tsvector и tsquery.
Создание tsvector
Разберите документ:
SELECT to_tsvector('english', 'The quick brown foxes jumped over');
-- 'brown':3 'fox':4 'jump':5 'quick':2Создание tsquery
Разберите запрос:
SELECT to_tsquery('english', 'fox & jumping'); -- 'fox' & 'jump'
SELECT websearch_to_tsquery('english', 'fox jumping -lazy');Сопоставление: @@
Проверьте документ по запросу:
SELECT 'fox jumping'::tsvector @@ 'fox & jump'::tsquery; -- tИндексация для FTS
Добавьте столбец tsvector и индекс GIN:
ALTER TABLE articles
ADD COLUMN search_doc tsvector
GENERATED ALWAYS AS (
to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,''))
) STORED;
CREATE INDEX articles_search_idx ON articles USING GIN (search_doc);Выполнение запросов
Быстрый поиск с фильтрацией:
SELECT id, title FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', 'postgres performance')
ORDER BY ts_rank(search_doc, websearch_to_tsquery('english', 'postgres performance')) DESC
LIMIT 20;Ранжирование с помощью ts_rank
ts_rank оценивает результаты на основе частоты и позиции слов. ts_rank_cd использует плотность покрытия (с учётом позиций):
SELECT id, ts_rank_cd(search_doc, q) AS rank
FROM articles, websearch_to_tsquery('english', $1) AS q
WHERE search_doc @@ q
ORDER BY rank DESC LIMIT 20;Фрагменты с помощью ts_headline
Показывайте найденные фрагменты с выделенными совпавшими словами:
SELECT ts_headline('english', body,
websearch_to_tsquery('english', $1),
'StartSel=<mark>, StopSel=</mark>, MaxFragments=2')
FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', $1);Поиск фраз
Находите соседние слова:
SELECT * FROM articles
WHERE search_doc @@ phraseto_tsquery('english', 'database performance');Повышение веса нескольких полей
Придайте заголовку больший вес, чем тексту, с помощью setweight:
ALTER TABLE articles
ADD COLUMN search_doc tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(title,'')), 'A') ||
setweight(to_tsvector('english', coalesce(body,'')), 'B')
) STORED;Языковая конфигурация
Конфигурация english задаёт стоп-слова, нормализацию и другие параметры. PostgreSQL поддерживает множество языков; выбирайте нужный язык:
SELECT to_tsvector('turkish', 'Veritabanı performansı');Ограничения встроенного FTS
Подходит для языков, похожих на английский, и обеспечивает базовое ранжирование. Для более сложных задач (BM25, векторные представления, фасетный поиск) рассмотрите Elasticsearch или OpenSearch вместе с PostgreSQL.
Итоги
FTS в PostgreSQL — достойный вариант по умолчанию.
- Сопоставление с помощью tsvector + tsquery + @@
- Индекс GIN для ускорения
- websearch_to_tsquery для пользовательского ввода
- ts_rank/ts_headline для ранжированных результатов с подсветкой
Быстрая проверка
Вам нужно быстро фильтровать статьи по полнотекстовому запросу. Какой индекс выбрать?
Часто задаваемые вопросы
Урок «Полнотекстовый поиск с tsvector и GIN» бесплатный?
Да — полный текст урока «Полнотекстовый поиск с tsvector и GIN» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Полнотекстовый поиск с tsvector и GIN»?
Создавайте полнотекстовый поиск для промышленных систем с помощью столбцов tsvector, индексов GIN и настраиваемых словарей текстового поиска Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Полнотекстовый поиск с tsvector и GIN»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Поиск по триграммам (pg_trgm) для нечёткого сопоставления
- Полнотекстовый поиск с tsvector и GIN
- Геопространственная индексация с PostGIS
- Векторный поиск с pgvector