0Pricing
SQL Academy · Урок

Полнотекстовый поиск с 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 — локальная установка не требуется.

Все уроки этого курса

  1. Поиск по триграммам (pg_trgm) для нечёткого сопоставления
  2. Полнотекстовый поиск с tsvector и GIN
  3. Геопространственная индексация с PostGIS
  4. Векторный поиск с pgvector
← Назад к SQL Academy