該 lakebase_text 擴充功能透過索引類型為 Lakebase lakebase_bm25 新增了 BM25 全文搜尋功能。 它相容於 PostgreSQL 的標準 tsvector 型別與查詢運算子。
Install
首先,在專案設定 中啟用 Lakebase Search 。 然後安裝擴充功能:
CREATE EXTENSION IF NOT EXISTS lakebase_text;
升級擴充與索引
新的 Lakebase Search 版本可以新增功能、修正與效能提升。 雖然 Lakebase Search 是作為 Lakebase 更新的一部分釋出,但它並非自動升級所有資料。 在 lakebase_text中,有兩個東西分別升級,並攜帶彼此無關的版本號:
-
擴充版本 是建立 SQL 物件
CREATE EXTENSION lakebase_text的版本,包括資料型別、函式、運算子及lakebase_bm25索引存取方法。 此版本由SELECT installed_version FROM pg_available_extensions WHERE name = 'lakebase_text'。ALTER EXTENSION lakebase_text UPDATE更新本版本。 -
索引儲存格式 是索引在磁碟上的佈局
lakebase_bm25。 擴充功能可能會在更新中引入更新的索引儲存格式,解鎖更多功能並帶來更佳的效能。 所有新建立的索引會自動使用最新的儲存格式,而現有索引則可在有新儲存格式可用後升級為新格式REINDEX INDEX CONCURRENTLY。
升級並不急迫。 這個擴充功能相容於舊版本的 SQL 物件和索引儲存格式,但保持最新能讓你走在支援且效能最佳的路徑上,避免日後大規模遷移,因此方便時升級,而非無限期拖延。
Note
最新可用的擴充套件版本由 報告。SELECT default_version FROM pg_available_extensions WHERE name = 'lakebase_text'
為什麼lakebase_text而非標準的GIN全文搜尋
PostgreSQL 內建的全文搜尋會使用 GIN 索引並 ts_rank 進行相關性評分。
ts_rank 不使用全球語料庫統計,因此隨著資料成長,分數會下降。
lakebase_text 在兩方面改進了這個問題:
- BM25 排名 同時考量詞彙頻率、文件長度及語料庫整體統計,產生比 TF-IDF 更精確的相關性分數。
- Top-K pushdown 使用 Block-Max WAND 只回傳索引中最相關的 K 個結果,而非評分結果集中的每一個匹配。
快速入門
插入資料後建立 lakebase_bm25 索引。 BM25 在索引建置時計算語料庫範圍的統計數據,而非增量計算,因此索引必須建立在填入資料表上。
-- Create a table with a generated tsvector column
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
passage TEXT,
vector TSVECTOR GENERATED ALWAYS AS (to_tsvector('english', passage)) STORED
);
-- Insert data before building the BM25 index
INSERT INTO documents (passage) VALUES
('Postgres is a powerful open-source relational database.'),
('Vector search finds semantically similar results.'),
('BM25 ranking improves full-text search relevance scores.');
-- Create the BM25 index on the populated table
CREATE INDEX documents_passage_bm25 ON documents USING lakebase_bm25 (vector);
-- Query: lower score means more relevant
SELECT id, passage,
vector <@> to_bm25query(to_tsvector('english', 'database'), 'documents_passage_bm25') AS score
FROM documents
ORDER BY score
LIMIT 5;
操作員 <@> 回傳負值的BM25分數。 依分數由高到低排序,先返回最相關的結果。
Note
lakebase_bm25索引掃描可以省略任意數量的列,且<@>其值恰好0.0為 。 不要只依賴零距離的排被回傳或順序。 要評估每一列,請設定 lakebase_bm25.enable_scan 為 off 以使用序列掃描。
從同步資料表填充
如果你是從 Unity Catalog 載入原始碼文字,而不是直接插入,同步後的資料表可以在同步時產生tsvector欄位,並準備好在同步完成後立即索引。lakebase_bm25 請參閱 湖底搜尋的自訂類型映射。
保持索引的準確性
BM25 統計數據在索引建置時計算並更新。VACUUM 大多數工作量中,常規 VACUUM 會計師會保持分數準確。 在大量新資料批量載入後,請手動執行 VACUUM :
VACUUM documents;
為了維持查詢與更新效能, VACUUM 必須及時清理索引。 對於專門用於文字搜尋的資料表,Databricks 建議設定 autovacuum_vacuum_insert_scale_factor 為 , 0 使插入觸發的自動真空閾值不會隨資料表增加:
ALTER TABLE documents SET (
autovacuum_vacuum_insert_scale_factor = 0
);
當 尺度因子設為 0時, autovacuum_vacuum_insert_threshold 決定觸發自動真空的固定插入元組數量。 根據你的工作量調整這個門檻。
警告
BM25 全球統計數據未包含 MVCC 版本。 如果 VACUUM 在交易使用較舊的 MVCC 快照時更新統計數據,該交易可利用比其列快照更新的統計數據計算分數。 列可見性仍符合 MVCC 規範,但分數、排名及前 K 名額結果在交易中 REPEATABLE READ 可能會變動。 不要依賴快照穩定的 BM25 排名,涵蓋同時進行 VACUUM,包括自吸真空。
曲目搜尋
會話層級 GUC
| 參數 | 類型 | Default | Description |
|---|---|---|---|
lakebase_bm25.default_limit |
整數 | 1000 |
索引回傳的最大結果數。 |
lakebase_bm25.prefilter |
boolean | false |
當 true時,會在 WHERE 計算 BM25 分數前評估條件。 當濾網去除多排且評估成本低時使用。 |
lakebase_bm25.enable_scan |
boolean | true |
設定為 強制 false 順序掃描,繞過索引。 對測試很有用。 |
SET lakebase_bm25.default_limit TO 20;
SET lakebase_bm25.prefilter = on;
當兩者同時設定時,GUC 優先於索引儲存參數。
索引儲存參數
在索引建立時或以 ALTER INDEX:
| 參數 | 類型 | Default | 範圍 | Description |
|---|---|---|---|---|
k1 |
real | 1.2 |
1.2 到 2.0 | 詞頻飽和。 較高的數值會讓重複的詞語權重增加。 |
b |
real | 0.75 |
0.0 到 1.0 | 文件長度正規化。
0.0 關閉長度正規化; 1.0 套用完整正規化。 |
default_limit |
整數 | 1000 |
1 至 65535 | 當 GUC 會話未設定時,備用限制。 |
prefilter |
boolean | false |
N/A | 當會話 GUC 未設定時,請使用備用預濾器設定。 |
-- Set parameters at index creation (use a new name — the Quick start already created documents_passage_bm25)
CREATE INDEX documents_passage_bm25_tuned ON documents USING lakebase_bm25 (vector)
WITH (default_limit = 20, k1 = 1.5);
-- Update parameters on an existing index
ALTER INDEX documents_passage_bm25_tuned SET (default_limit = 50);
API 參考資料
型別
bm25query_tsvector: 將查詢 tsvector 與目標索引識別碼結合。 用作 的 <@>右運算元。
運營商
| Operator | Signature | Returns | Description |
|---|---|---|---|
<@> |
tsvector <@> bm25query_tsvector |
double precision |
回傳負值的BM25分數。 依序向上排序以獲得最相關的結果。 |
Functions
| 功能 | Returns | Description |
|---|---|---|
to_bm25query(query tsvector, index regclass) |
bm25query_tsvector |
從 與 tsvector 索引的物件識別碼建構 BM25 查詢物件。 |
運算子類別
| Class | 預設值為 | Description |
|---|---|---|
tsvector_bm25_ops |
tsvector |
將 tsvector 欄位映射給 <@> 操作員,用於 BM25 計分。 這是 的 tsvector 預設運算子類別,且 lakebase_bm25;你不需要明確指定。 |