
PGX, Inc. 於 2026 年 10 月 7 日在 PostgreSQL 官方新聞頁公布,推出 pgx-bm25 1.0——一個把 Okapi BM25 排序全文檢索加入 PostgreSQL 的擴充,以原生索引存取方法實作。該擴充支援 PostgreSQL 17 與 18,安裝後以 bm25_native 使用。[1]
用法
官方示範建立擴充與索引,並以運算子查詢:[1]
“` 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 節點。[1]
為何是「PostgreSQL 索引」
官方強調,整個索引存放於索引關聯本身的頁面之中,因此自動獲得核心提供的 WAL 記錄、故障恢復與物理複製;VACUUM 會維護它,不需要外部搜尋引擎,亦沒有獨立執行環境要維運。擴充以 C 語言針對原版伺服器標頭編寫,並以 PGXS 建置,工具鏈只需一個 C 編譯器與 pg_config。[1]
文本以 PostgreSQL 自家的 Snowball 詞典分析,語言按索引設定,因此搜尋 negligent 可以找到 negligence。排序取前 N 的查詢採用 block-max WAND,令典型的 LIMIT 10 搜尋毋須為每份符合文件計分。[1]
查詢功能
官方列出多項查詢功能:[1]
- 多欄索引與 BM25F 計分:支援每欄加成與每欄長度正規化;
k1、b與各項加成可用ALTER INDEX ... SET修改,並在下次掃描生效,毋須REINDEX - 精確短語,以及按詞距排序或無序的近鄰搜尋
- 布林查詢(
must、should、must_not),可任意嵌套 - 前綴通配符(如
judg*) - 查詢時對任何子句加成
- 以
bm25_snippet()產生高亮片段,預設作 HTML 轉義
官方指出,簡單搜尋可寫成文字字串,其餘則由 builder 函數組出 jsonb 查詢樹,令使用者輸入永遠以數值形式到達、而非查詢語法。[1]
授權與測試
pgx-bm25 以 PostgreSQL License 發布,與 PostgreSQL 本身相同條款;官方強調它是獨立項目,不依賴亦不連接任何其他產品或服務,亦沒有另外的商業版本,原始碼、回歸與 TAP 測試套件、基準測試腳本及設計記錄全部放在儲存庫。[1][2]
官方指出,索引的磁碟格式帶有相容性承諾:新增式的格式變更毋須 REINDEX,而在破壞性變更允許的情況下,bm25_upgrade() 可原地遷移索引。CI 會針對 PostgreSQL 17 與 18 建置及測試,包括啟用 assert、UBSan 與 AddressSanitizer 的執行,並以 TAP 測試涵蓋故障恢復與副本一致性;PostgreSQL 19 則針對現行 beta 測試,但尚未列為支援的主要版本。[1]