SQL Academy · Урок

Введение в полнотекстовый поиск (tsvector, to_tsquery)

Индексируйте документы с помощью tsvector, выполняйте запросы на естественном языке с to_tsquery и ранжируйте результаты с ts_rank

Урок 4 из 414 шагов

«Введение в полнотекстовый поиск (tsvector, to_tsquery)» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Зачем нужен полнотекстовый поиск

LIKE и ILIKE находят подстроки. Полнотекстовый поиск (FTS) понимает слова: выполняет стемминг, учитывает стоп-слова, правила языка и релевантность с ранжированием. Он встроен в PostgreSQL — расширение не требуется.

Два основных типа

FTS опирается на два типа:

  • tsvector — разобранный документ: лексемы и позиции
  • tsquery — разобранный запрос: лексемы и булевы операторы

Для их сопоставления используется оператор @@.

Разбор документа

Преобразуйте исходный текст в tsvector:

SELECT to_tsvector('english', 'The quick brown foxes jump over the lazy dogs');
-- 'brown':3 'dog':9 'fox':4 'jump':5 'lazi':8 'quick':2
-- Stop words ('the', 'over') dropped; words stemmed (foxes → fox)

Разбор запроса

И входные данные поиска:

SELECT to_tsquery('english', 'foxes & dogs');
-- 'fox' & 'dog'

Сопоставление

Используйте @@ для проверки:

SELECT to_tsvector('english', 'The lazy fox')
        @@ to_tsquery('english', 'fox');    -- TRUE

Индексация таблицы документов

Добавьте столбец tsvector и индекс GIN для быстрого выполнения запросов:

CREATE TABLE articles (
  id BIGSERIAL PRIMARY KEY,
  title TEXT NOT NULL,
  body  TEXT NOT NULL
);

-- Either keep a generated tsvector column:
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 @@ to_tsquery('english', 'postgres & json')
ORDER BY id DESC;

Булевы операторы в запросах

tsquery поддерживает & (AND), | (OR), ! (NOT) и группировку:

to_tsquery('english', '(cat | dog) & !rabbit');

Поиск фраз

Используйте <-> для соседних слов:

to_tsquery('english', 'postgres <-> performance');
-- finds 'postgres performance', not 'postgres is great for performance'

Удобные веб-запросы: websearch_to_tsquery

Принимайте запросы в стиле Google:

SELECT websearch_to_tsquery('english', 'postgres "json indexing" -mongo');

Ранжирование результатов

Ранжируйте результаты с помощью ts_rank или ts_rank_cd:

SELECT id, title,
       ts_rank(search_doc, query) AS rank
FROM articles, to_tsquery('english', 'postgres & json') AS query
WHERE search_doc @@ query
ORDER BY rank DESC
LIMIT 20;

Выделение совпадений

Показывайте фрагменты с совпадениями:

SELECT ts_headline('english', body,
  to_tsquery('english', 'postgres & json'),
  'StartSel=<mark>,StopSel=</mark>')
FROM articles
WHERE search_doc @@ to_tsquery('english', 'postgres & json');

Повторение

FTS встроен в PostgreSQL.

  • tsvector + tsquery + @@
  • Индекс GIN для ускорения
  • websearch_to_tsquery для пользовательского ввода
  • ts_rank для сортировки по релевантности

Быстрая проверка

Какой оператор сопоставляет tsvector с tsquery?

Можно начать бесплатно

Изучай SQL с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
46
Уроки
183

Часто задаваемые вопросы

Урок «Введение в полнотекстовый поиск (tsvector, to_tsquery)» бесплатный?

Да — полный текст урока «Введение в полнотекстовый поиск (tsvector, to_tsquery)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Введение в полнотекстовый поиск (tsvector, to_tsquery)»?

Индексируйте документы с помощью tsvector, выполняйте запросы на естественном языке с to_tsquery и ранжируйте результаты с ts_rank Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Введение в полнотекстовый поиск (tsvector, to_tsquery)»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Конкатенация: || и CONCAT
  2. UPPER, LOWER, SUBSTRING, REPLACE
  3. TRIM, LPAD, RPAD
  4. Введение в полнотекстовый поиск (tsvector, to_tsquery)
← Назад к SQL Academy