PostgreSQL pg_trgm: GIN-индекс для поиска по подстроке

Категория: Postgresql · Язык: SQL · Обновлено:

Расширение pg_trgm строит GIN-индекс по триграммам и ускоряет поиск по шаблону LIKE или ILIKE, например по части названия. Это полезно, когда обычный B-tree не помогает с шаблоном, начинающимся с процента. Для коротких поисковых строк планировщик может выбрать последовательное чтение вместо индекса.

Создать индекс и выполнить поиск

Замените products и name на таблицу и текстовый столбец проекта. CREATE INDEX CONCURRENTLY запускайте отдельно от транзакции:

SQL
CREATE EXTENSION IF NOT EXISTS pg_trgm;

CREATE INDEX CONCURRENTLY IF NOT EXISTS products_name_trgm_idx
    ON products USING gin (name gin_trgm_ops);

PREPARE product_search(text) AS
    SELECT id, name
    FROM products
    WHERE name ILIKE '%' || $1 || '%';

EXECUTE product_search('keyboard');
DEALLOCATE product_search;

Перед установкой проверьте, что pg_trgm доступно в сборке PostgreSQL и у роли есть право CREATE в текущей базе. Построение индекса с CONCURRENTLY уменьшает блокировку обычных записей, но всё равно нагружает базу; проверьте план на реальных данных. Параметр запроса передаётся отдельно от SQL. Символы процента и подчёркивания в нём остаются wildcard-символами, поэтому экранируйте их, если нужен буквальный поиск.

GIN подходит для фильтрации ILIKE и поиска по триграммному сходству. Для ближайших строк с сортировкой по расстоянию <-> документация рекомендует рассмотреть GiST: GIN такой поиск эффективно не обслуживает.

Документация: pg_trgm.