Какие основные типы данных и операторы используются для реализации полнотекстового поиска в PostgreSQL?

Ответ

Для полнотекстового поиска (Full-Text Search, FTS) в PostgreSQL используются два основных типа данных и специальный оператор сопоставления.

Типы данных


  1. tsvector (Text Search Vector)

    Это тип данных, который хранит документ в оптимизированном для поиска виде: набор уникальных лексем (слов), которые были нормализованы (приведены к основной форме через стемминг) и из которых удалены стоп-слова (предлоги, союзы и т.д.).



  2. tsquery (Text Search Query)

    Это тип данных для хранения поискового запроса. Он также состоит из нормализованных лексем и может включать логические операторы для их комбинирования: & (И), | (ИЛИ), ! (НЕ).


Основной оператор

  • @@ — оператор сопоставления. Он возвращает true, если tsvector (документ) соответствует tsquery (запросу).

Пример рабочего процесса

-- 1. Создаем таблицу с колонкой типа tsvector
CREATE TABLE articles (
    id SERIAL PRIMARY KEY,
    title TEXT,
    body TEXT,
    search_vector TSVECTOR
);

-- 2. Заполняем таблицу, преобразуя текст в tsvector с помощью to_tsvector()
INSERT INTO articles (title, body)
VALUES ('A Quick Guide to Go', 'Golang is a fast and compiled language.');

-- Рекомендуется обновлять tsvector через триггер или при записи данных
UPDATE articles
SET search_vector = to_tsvector('russian', title || ' ' || body)
WHERE id = 1;

-- 3. Выполняем поиск с помощью to_tsquery() и оператора @@
SELECT title, body
FROM articles
WHERE search_vector @@ to_tsquery('russian', 'быстрый & язык');

-- 4. Для ускорения поиска создаем GIN-индекс
CREATE INDEX idx_articles_search ON articles USING GIN(search_vector);

Использование GIN (Generalized Inverted Index) индекса критически важно для производительности полнотекстового поиска на больших объемах данных.