pg_fts

提供 BM25、BM25F 排序与专用倒排索引的全文检索扩展

概览

扩展包名版本分类许可证语言
pg_fts0.2.0FTSPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2220pg_fts-
相关扩展pg_search pg_textsearch vchord_bm25 psql_bm25s pg_bestmatch

Requires PostgreSQL 17 or newer; the control file marks the extension trusted and relocatable; RPM builds also provide an llvmjit subpackage.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.2.01817161514pg_fts-
RPMPIGSTY0.2.01817161514pg_fts_$v-
DEBPIGSTY0.2.01817161514postgresql-$v-pg-fts-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64N/AN/AN/A
el8.aarch64N/AN/AN/A
el9.x86_64N/AN/AN/A
el9.aarch64N/AN/AN/A
el10.x86_64N/AN/AN/A
el10.aarch64N/AN/AN/A
d12.x86_64N/AN/AN/A
d12.aarch64N/AN/AN/A
d13.x86_64N/AN/AN/A
d13.aarch64N/AN/AN/A
u22.x86_64N/AN/AN/A
u22.aarch64
PIGSTY 0.2.0
PIGSTY 0.2.0
N/AN/AN/A
u24.x86_64N/AN/AN/A
u24.aarch64
PIGSTY 0.2.0
PIGSTY 0.2.0
N/AN/AN/A
u26.x86_64N/AN/AN/A
u26.aarch64N/AN/AN/A

构建

您可以使用 pig build 命令构建 pg_fts 扩展的 RPM / DEB 包:

pig build pkg pg_fts         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_fts 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_fts;          # 当前活跃 PG 版本安装
pig ext install -y pg_fts -v 18  # PG 18
pig ext install -y pg_fts -v 17  # PG 17
dnf install -y pg_fts_18       # PG 18
dnf install -y pg_fts_17       # PG 17
apt install -y postgresql-18-pg-fts   # PG 18
apt install -y postgresql-17-pg-fts   # PG 17

创建扩展

CREATE EXTENSION pg_fts;

用法

来源:

pg_fts 通过专用的 ftsdocftsquery 类型以及 fts 倒排索引访问方法提供 BM25/BM25F 全文排序。它支持布尔、短语、NEAR、前缀、模糊和正则表达式术语,同时在索引中保留语料库统计信息以进行相关性评分。版本 0.2.0 要求 PostgreSQL 17 或更高版本。

创建并查询索引

CREATE EXTENSION pg_fts;

CREATE TABLE docs (
    id bigint PRIMARY KEY,
    body text NOT NULL
);

CREATE INDEX docs_fts
ON docs USING fts (to_ftsdoc('english', body));

使用相同的文本搜索配置用于文档和普通查询术语:

WITH q AS (
    SELECT to_ftsquery('english', 'postgres & "query planner" & index*') AS query
)
SELECT d.id,
       fts_snippet(d.body, q.query) AS excerpt
FROM docs AS d
CROSS JOIN q
WHERE to_ftsdoc('english', d.body) @@@ q.query
ORDER BY to_ftsdoc('english', d.body) <=> q.query
LIMIT 10;

@@@ 匹配,而 <=> 升序距离按降序相关性排序行,并可驱动索引顺序扫描以支持 top-k 查询。

查询语言与 API 索引

  • to_ftsdoc([regconfig,] text)to_ftsquery([regconfig,] text): 分析文档并解析查询。
  • quick brown, quick & brown, quick | brown!slow: 显式/隐式 AND、OR 和 NOT。
  • "quick brown", NEAR(...), term*, term~2/regular-expression/: 短语、接近度、前缀、模糊和正则表达式术语。
  • fts_bm25, fts_bm25_optsfts_bm25f: 显式的 BM25 排序变体和多字段排序。
  • fts_index_stats(index)fts_index_df(index, query): 索引维护的文档计数、平均长度、词汇表大小和词频。
  • fts_highlightfts_snippet: 展示匹配文本。
  • fts_search(index, query, k)fts_count(index, query): 索引本地 top-k 和 MVCC 意识的计数操作。
  • tsquery_to_ftsquery(tsquery): 迁移辅助程序;它不会使 pg_fts 成为 tsvector/GIN 的透明替代品。

维护与版本注意事项

SELECT fts_merge('docs_fts');
SELECT fts_vacuum('docs_fts');
  • 插入进入立即可匹配的待处理列表,但排名 <=>fts_search 结果覆盖合并段。当新插入文档必须立即参与排序时,请运行 fts_merge()
  • fts_vacuum() 会压缩段并回收可重用的索引页面;普通 VACUUM 也会参与待处理列表和删除标记维护。
  • 版本 0.2.0 将访问方法从 bm25 重命名为 fts。由 0.1.0 创建且使用 USING bm25 的索引必须重新创建。
  • 如果库报告磁盘格式不匹配,请遵循其 REINDEX 提示,而不是尝试用不同版本的格式读取索引。
  • 访问方法是非覆盖的,并且在此版本中不提供并行扫描。在逻辑复制订阅者上分别安装扩展和索引;索引本身不会进行逻辑复制。