Введение в полнотекстовый поиск (tsvector, to_tsquery)
Индексируйте документы с помощью tsvector, выполняйте запросы на естественном языке с to_tsquery и ранжируйте результаты с ts_rank
«Введение в полнотекстовый поиск (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 — локальная установка не требуется.
Все уроки этого курса
- Конкатенация: || и CONCAT
- UPPER, LOWER, SUBSTRING, REPLACE
- TRIM, LPAD, RPAD
- Введение в полнотекстовый поиск (tsvector, to_tsquery)