lakebase_text

該 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'

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;你不需要明確指定。

下一步