PGX Inc. 发布了 pgx-bm25 1.0 版本,这是一个扩展,将 Okapi BM25 排序全文搜索作为原生索引访问方法添加到 PostgreSQL。它支持 PostgreSQL 17 和 18,并以 bm25_native 安装。
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 节点。
整个索引位于索引关系自身的页面中,因此它从核心获得 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 查询树的构建函数组成,因此用户输入始终作为值到达,而从不作为查询语法:
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 License 下发布,条款与 PostgreSQL 本身相同。它是一个独立项目:不依赖、也不连接任何其他产品或服务,并且没有单独的商业版本。源代码、回归测试和 TAP 测试套件、基准测试脚本以及设计记录(架构指南和设计决策日志)都在仓库中。
磁盘格式带有兼容性契约:增量格式变更不需要 REINDEX,而在破坏性变更允许的情况下,bm25_upgrade() 会就地迁移索引。CI 针对 PostgreSQL 17 和 18 进行构建和测试,包括启用断言、UBSan 和 AddressSanitizer 的运行,以及针对崩溃恢复和副本一致性的 TAP 测试。PostgreSQL 19 针对当前 beta 版本进行测试,但尚不是受支持的主版本。
make sudo make install
源代码、文档和问题跟踪器:https://github.com/pgexperts/pgx-bm25
转载声明:本文为转载整理,原文版权归原作者及原站点所有。
原文来源:PostgreSQL Blog
原文作者:PGX, Inc.;如有侵权,请联系管理员删除。