pgx-bm25 1.0 面世:BM25 排序全文檢索成為 PostgreSQL 原生索引

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]

參考資料

[1] PostgreSQL 官方新聞 — pgx-bm25 1.0: BM25 ranked full-text search as a native PostgreSQL index(2026 年 10 月 7 日)

[2] GitHub — pgexperts/pgx-bm25 官方儲存庫

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*