lakebase_text拡張機能は、lakebase_bm25インデックスの種類を使用して、BM25 フルテキスト検索を Lakebase に追加します。 PostgreSQL の標準の tsvector 型およびクエリ演算子と互換性があります。
Install
まず、プロジェクト設定で Lakebase Search を有効にします 。 次に、拡張機能をインストールします。
CREATE EXTENSION IF NOT EXISTS lakebase_text;
拡張とインデックスのアップグレード
新しいLakebase Searchリリースは、機能、修正、パフォーマンス向上を追加できます。 Lakebase SearchはLakebaseのアップデートの一部としてリリースされていますが、すべてを自動的にアップグレードするわけではありません。
lakebase_textでは、2つのものが別々にアップグレードし、互いに無関係なバージョン番号を持ちます。
-
拡張バージョン とは、
CREATE EXTENSION lakebase_text作成するSQLオブジェクトのバージョンであり、そのデータ型、関数、演算子、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'が報告しています。
標準の GIN フルテキスト検索の代わりにlakebase_text理由
PostgreSQL の組み込みのフルテキスト検索では、関連性スコア付けに GIN インデックスと ts_rank が使用されます。
ts_rank ではグローバル コーパス統計が使用されないため、データの増加に合わせてスコアが低下します。
lakebase_text は、次の 2 つの方法で改善されます。
- BM25 ランク付 けでは、用語の頻度、ドキュメントの長さ、コーパス全体の統計が同時に考慮され、TF-IDF よりも正確な関連性スコアが生成されます。
- Top-K プッシュダウン では、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準拠のままですが、 REPEATABLE READ 取引中にスコア、ランキング、トップKの結果は変更されることがあります。 同時進行 VACUUM、オートバキュームを含むスナップショット安定なBM25ランキングに頼らないでください。
検索の調整
セッション レベルの GUC
| パラメーター | タイプ | Default | 説明 |
|---|---|---|---|
lakebase_bm25.default_limit |
整数 | 1000 |
インデックスから返される結果の最大数。 |
lakebase_bm25.prefilter |
boolean | false |
trueすると、BM25 スコアを計算する前にWHERE条件を評価します。 フィルターによって多くの行が削除され、評価が低い場合に使用します。 |
lakebase_bm25.enable_scan |
boolean | true |
インデックスをバイパスしてシーケンシャル スキャンを強制するには、 false に設定します。 テストに役立ちます。 |
SET lakebase_bm25.default_limit TO 20;
SET lakebase_bm25.prefilter = on;
両方が設定されている場合、GUC はインデックス ストレージ パラメーターよりも優先されます。
ストレージ パラメーターのインデックスを作成する
インデックス作成時または ALTER INDEXで、次のオプションを設定します。
| パラメーター | タイプ | Default | 範囲 | 説明 |
|---|---|---|---|---|
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 | 返品 | 説明 |
|---|---|---|---|
<@> |
tsvector <@> bm25query_tsvector |
double precision |
負の BM25 スコアを返します。 最も関連性の高い結果を最初に取得するには、昇順で並べ替えます。 |
Functions
| Function | 返品 | 説明 |
|---|---|---|
to_bm25query(query tsvector, index regclass) |
bm25query_tsvector |
tsvectorとインデックスのオブジェクト識別子から BM25 クエリ オブジェクトを構築します。 |
演算子クラス
| クラス | 既定値 | 説明 |
|---|---|---|
tsvector_bm25_ops |
tsvector |
tsvector列を BM25 スコアリングの<@>演算子にマップします。 これは、tsvectorを使用するlakebase_bm25の既定の演算子クラスです。明示的に指定する必要はありません。 |