PostgreSQL строится на типах tsvector и tsquery: первый хранит нормализованные токены документа, второй описывает поисковый запрос. Для быстрых поисков обычно используют оператор @@ и GIN-индекс по tsvector.
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-индекс, чтобы не сканировать таблицу целиком.
Оцени свой прогресс