↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

pgx-bm25 1.0 发布:以 PostgreSQL 原生索引实现 BM25 全文检索排序

发布于 2026-10-07,PGX, Inc.
相关开源软件

PGX Inc. 发布了 pgx-bm25 1.0。这个扩展通过原生索引访问方法,为 PostgreSQL 增加了基于 Okapi BM25 的全文检索排序。它支持 PostgreSQL 17 和 18,安装时使用扩展名 bm25_native。

```sql CREATE EXTENSION bm25_native; CREATE INDEX docs_bm25 ON docs USING bm25_native (body);

SELECT id, bm25_score(ctid) AS score FROM docs WHERE body @@@ 'quick fox' ORDER BY body &@@ 'quick fox' LIMIT 10; ```

@@@ 选出匹配行,&@@ 按相关性排序。查询通过有序索引扫描执行,不产生 Sort 节点。

它是一个 PostgreSQL 索引

整个索引都保存在索引关系自身的数据页中,因此可直接使用内核提供的 WAL 日志、崩溃恢复和物理复制,并由 VACUUM 维护。无需外部搜索引擎,也不用运维独立的运行时。扩展以 C 编写,基于原版服务器头文件,通过 PGXS 构建;完整工具链只需 C 编译器和 pg_config。

文本分析使用 PostgreSQL 自带的 Snowball 词典,每个索引可以单独设置语言,因此搜索 negligent 也能找到 negligence。按相关性排序的 top-N 查询采用 block-max WAND,典型的 LIMIT 10 搜索无需给所有匹配文档计算分数。

查询功能

  • 支持多列索引和 BM25F 评分,可为各字段设置权重和长度归一化参数。k1、b 和权重可通过 ALTER INDEX ... SET 修改,下一次扫描即生效,无需 REINDEX。
  • 支持精确短语,以及按词元距离进行有序或无序邻近搜索。
  • 支持布尔查询(must、should、must_not),可按需嵌套。
  • 支持前缀通配符(judg*)。
  • 可在查询时为任意子句设置权重。
  • bm25_snippet() 提供高亮摘要,默认进行 HTML 转义。

简单搜索可以直接写成文本字符串。其他查询由构造函数组合为 jsonb 查询树,用户输入始终作为值传入,不会被当作查询语法:

```sql CREATE INDEX docs_bm25 ON docs USING bm25_native (title, summary, body) INCLUDE (id) WITH (key_field = 'id');

SELECT id, bm25_score_key(id) AS score FROM docs WHERE title @@@ bm25_boolean( must => ARRAY[ bm25_term('body', 'tort') ], must_not => ARRAY[ bm25_term('body', 'battery') ]) ORDER BY title &@@ bm25_boolean( must => ARRAY[ bm25_term('body', 'tort') ], must_not => ARRAY[ bm25_term('body', 'battery') ]) LIMIT 10; ```

许可证

pgx-bm25 使用与 PostgreSQL 相同的 PostgreSQL 许可证。这是一个独立项目,不依赖或连接其他产品与服务,也没有单独的商业版。仓库中包含源代码、回归测试和 TAP 测试、基准测试脚本,以及设计记录(架构指南和设计决策日志)。

升级与测试

磁盘格式有明确的兼容性约定:增量式格式变更不要求 REINDEX;对于破坏性变更,在条件允许时可用 bm25_upgrade() 原位迁移索引。CI 会针对 PostgreSQL 17 和 18 构建与测试,包括启用断言、UBSan 和 AddressSanitizer 的运行,以及检查崩溃恢复和副本一致性的 TAP 测试。PostgreSQL 19 已基于当前测试版进行测试,但尚未列为正式支持的大版本。

获取方式

sh make sudo make install

源码、文档与问题跟踪:https://github.com/pgexperts/pgx-bm25