pg_textsearch — это открытое расширение для PostgreSQL, реализующее полнотекстовый поиск с релевантным ранжированием результатов на основе алгоритма BM25 (Best Matching 25). Он является индустриальным стандартом для оценки качества совпадения текста и применяется во многих поисковых системах благодаря способности учитывать частоту термина, редкость слова в корпусе и длину документа. pg_textsearch делает PostgreSQL не просто СУБД, а полноценной поисковой платформой без необходимости использовать внешние поисковые движки вроде Elasticsearch или Algolia.
Исходный код проекта и документация доступны на GitHub:
https://github.com/timescale/pg_textsearchПрактическое применение
Расширение pg_textsearch особенно полезно, когда нужно:
- добавить релевантный полнотекстовый поиск в приложения без выделенного поискового сервера;
- улучшить качество ранжирования результатов по сравнению с базовым ts_rank PostgreSQL;
- строить гибридный поиск, сочетая BM25-ранжирование с семантическими embedding-поисками (например, через pgvector/pgvectorscale) для AI-и RAG-приложений;
- использовать PostgreSQL как единый стек данных и поиска, что упрощает архитектуру и снижает операционные издержки.
Типичные сценарии: поиск по каталогам товаров, документации, блогам, чат-ботам, системам рекомендаций и информационным панелям.
Как установить pg_textsearch
1. Требования
PostgreSQL v17 или v18 (расширение поддерживает эти версии).
2. Установка расширения
Если у вас уже есть PostgreSQL с поддержкой сборки расширений:
CREATE EXTENSION pg_textsearch;3. Создание BM25-индекса
Пример таблицы:
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
content TEXT
);
INSERT INTO documents (content) VALUES
('PostgreSQL is a powerful database system'),
('BM25 is an effective ranking function'),
('Full-text search with custom scoring');
Создание BM25-индекса:
CREATE INDEX docs_bm25_idx
ON documents
USING bm25(content)
WITH (text_config = 'english');4. Выполнение поиска
SELECT *
FROM documents
ORDER BY content <@> 'database system'
LIMIT 10;Оператор <@> возвращает BM25-оценку (в PostgreSQL сортировка по возрастанию означает более релевантные документы имеют более низкие значения).
Часто задаваемые вопросы (FAQ)
- Q: Чем pg_textsearch лучше встроенного FTS PostgreSQL?
A: Встроенный ts_rank в PostgreSQL оценивает совпадения по частоте термина, но не учитывает корпусную статистику (IDF, нормализацию длины и насыщение TF), что снижает качество ранжирования релевантных результатов. pg_textsearch реализует BM25, который эти факторы учитывает. - Q: Можно ли использовать pg_textsearch на больших таблицах?
A: Да, он поддерживает таблицы с разделами (partitioned tables) и работает на реальных объемах данных. - Q: Поддерживаются ли разные языки?
A: Да — можно использовать стандартные текстовые конфигурации PostgreSQL (english, french, german и другие) через параметр text_config. - Q: Требует ли pg_textsearch отдельного сервера или сервиса?
A: Нет — расширение работает на той же базе PostgreSQL, где хранятся ваши данные, что снижает архитектурную сложность.
Вывод
pg_textsearch — мощное расширение для PostgreSQL, которое приносит современный BM25-ранжированный полнотекстовый поиск прямо в реляционную базу данных. Он позволяет упростить архитектуру приложений, улучшить качество поиска и сократить зависимость от внешних поисковых систем. Это особенно актуально для стартапов, MVP-продуктов и гибридных AI-приложений, где важно иметь единый стек данных и поиска.
Если вам нужно быстро добавить релевантный поиск без лишних сервисов — pg_textsearch идет в ногу с современными требованиями разработчиков и архитекторов баз данных.