Полнотекстовый поиск в PostgreSQL: tsvector, tsquery?

Полнотекстовый поиск в PostgreSQL строится на типах tsvector и tsquery: первый хранит нормализованные токены документа, второй описывает поисковый запрос. Для быстрых поисков обычно используют оператор @@ и GIN-индекс по tsvector.
Подробный ответ

Что такое tsvector

tsvector — это тип данных, который хранит подготовленный для поиска текст: леммы, позиции и иногда веса слов. Он не просто хранит строку, а представляет её в виде набора поисковых лексем.

Что такое tsquery

tsquery описывает сам запрос: какие слова искать, как их комбинировать через &, |, ! и как искать префиксы.

Как это используется

SELECT title, content
FROM articles
WHERE to_tsvector('english', title || ' ' || content) @@
      to_tsquery('english', 'postgresql & search');

Оператор @@ проверяет, совпадает ли документ с поисковым запросом.

Как сделать быстро

На больших объёмах текста не стоит вычислять tsvector на лету в каждом запросе. Лучше хранить его в отдельной колонке или generated column и индексировать через GIN.

CREATE INDEX idx_articles_fts
ON articles USING GIN (search_vector);

Что ещё полезно знать

  • можно объединять несколько полей в один tsvector;

  • можно задавать веса для разных полей, например заголовок важнее описания;

  • для ранжирования используют ts_rank или ts_rank_cd;

  • почти всегда полезно ограничивать выдачу через LIMIT.

Как ответить на собеседовании

Полнотекстовый поиск в PostgreSQL строится на tsvector и tsquery: документ преобразуется в вектор лексем, запрос — в структуру условий, а сравнение идёт через @@. Для производительности я бы хранил tsvector отдельно и делал GIN-индекс, чтобы не сканировать таблицу целиком.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге