重要
この機能は ベータ版です。 ワークスペース管理者は、[ プレビュー] ページからこの機能へのアクセスを制御できます。 Manage Azure Databricks プレビューを参照してください。
lakebase_text拡張機能は、lakebase_bm25インデックスの種類を使用して、BM25 フルテキスト検索を Lakebase に追加します。 PostgreSQL の標準の tsvector 型およびクエリ演算子と互換性があります。
Install
まず、プロジェクト設定で Lakebase Search を有効にします 。 次に、拡張機能をインストールします。
CREATE EXTENSION IF NOT EXISTS 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 スコアを返します。 昇順スコアで並べ替えることで、最も関連性の高い結果が最初に返されます。
同期したテーブルからポピュレーション
Unity Catalogからソーステキストを直接挿入するのではなく読み込む場合、 同期したテーブルは 同期中に tsvector 列を生成し、同期が完了するとすぐに lakebase_bm25 でインデックス化できます。 湖 底検索のカスタムタイプマッピングを参照してください。
インデックスを正確に保つ
BM25 統計は、インデックスのビルド時に計算され、 VACUUMによって更新されます。 ほとんどのワークロードでは、通常の VACUUM によってスコアが正確に維持されます。 大量の新しいデータを一括読み込みした後、 VACUUM 手動で実行します。
VACUUM documents;
検索の調整
セッション レベルの 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の既定の演算子クラスです。明示的に指定する必要はありません。 |