Important
這項功能位於 測試版 (Beta) 中。 工作區管理員可以從 「預覽 」頁面控制對此功能的存取。 請參閱 管理 Azure Databricks 預覽。
該 lakebase_text 擴充功能透過索引類型為 Lakebase lakebase_bm25 新增了 BM25 全文搜尋功能。 它相容於 PostgreSQL 的標準 tsvector 型別與查詢運算子。
Install
首先,在專案設定 中啟用 Lakebase Search 。 然後安裝擴充功能:
CREATE EXTENSION IF NOT EXISTS 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分數。 依分數由高到低排序,先返回最相關的結果。
從同步資料表填充
如果你是從 Unity Catalog 載入原始碼文字,而不是直接插入,同步後的資料表可以在同步時產生tsvector欄位,並準備好在同步完成後立即索引。lakebase_bm25 請參閱 湖底搜尋的自訂類型映射。
保持索引的準確性
BM25 統計數據在索引建置時計算並更新。VACUUM 大多數工作量中,常規 VACUUM 會計師會保持分數準確。 在大量新資料批量載入後,請手動執行 VACUUM :
VACUUM documents;
曲目搜尋
會話層級 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;你不需要明確指定。 |