レイクベース・サーチ

重要

この機能は ベータ版です。 ワークスペース管理者は、[ プレビュー] ページからこの機能へのアクセスを制御できます。 Manage Azure Databricks プレビューを参照してください。

Lakebase Search は、ハイブリッド ベクター検索とキーワード検索を Lakebase 自動スケール プロジェクトに追加します。 プロジェクト設定で一度有効にしたら、lakebase_vectorlakebase_text の Postgres 拡張機能をインストールして、検索機能の構築を開始できます。

Lakebase Search には、2 つの補完的な検索方法が用意されています。 単独で使用するか、ハイブリッド検索のためにそれらを組み合わせます。

  • ベクター (セマンティック) 検索 では、単語を共有していない場合でも、クエリに最も近い意味の行が検索されます。 埋め込み (モデルによって生成された数値ベクトル) を使用してクエリを実行すると、インデックスは最も近いベクトルを距離で返します。 自然言語の質問、推奨事項、取得拡張生成 (RAG) に使用します。 lakebase_vectorによって動力を与えられる。
  • キーワード (フルテキスト) 検索 では、BM25 関連性スコアリングを使用して、クエリ内の正確な用語とどの程度一致するかによって行がランク付けされます。 名前やコード、文言が重要な場合の完全一致の用語検索に使用します。 lakebase_textによって動力を与えられる。
  • ハイブリッド検索 では、両方の検索が実行され、結果が 1 つのランク付けされたリストに結合されるため、意味的に類似した完全一致が得られます。 クエリで意図と特定の用語が混在する場合に使用します。実際の検索で最も一般的なケースです。

クエリ

どのように機能するのか

内部では、Lakebase Search は 2 つの Postgres 拡張機能に基づいて構築されています。

  • lakebase_vectorは、lakebase_annインデックス型を介して近似最近隣 (ANN) ベクトル検索を追加します。 これは pgvector のドロップイン コンパニオンです。同じベクター型、距離演算子、およびクエリ構文は変更なしで機能します。 内部的には、RaBitQ 量子化による IVF パーティション分割が使用されます。これは、1 つのインデックスで 10 億ベクトルを超えるインデックスをサポートし、HNSW より最大 50 ~ 100 倍高速に構築します。 インデックスはストレージに基づくものであり、ウォームアップなしで ゼロへのスケールで 存続します。

  • lakebase_text は、lakebase_bm25 インデックスタイプを介して BM25 フルテキスト検索を提供します。 PostgreSQL の標準の tsvector 型およびクエリ演算子と互換性があります。 BM25 ランク付けでは、用語の頻度、ドキュメントの長さ、コーパス全体の統計が同時に考慮されます。 Top-K プッシュダウン (Block-Max WAND) は、すべての一致に対してスコアを算出するのではなく、インデックスから関連性の高い上位 K 件の結果のみを取得します。

Lakehouseで発信されたデータに対して検索を提供でき、Postgresに直接書かれたデータだけでなく。 同期されたテーブルを使ってUnityカタログのテーブルをLakebaseに同期し、同期中にその列を検索可能なPostgresタイプにマッピングします:

  • クトル検索のために埋め込み列をvector(n)列にマッピングします。
  • キーワード検索のためにソーステキストからtsvector列を生成します。

同期が完了したら、同期されたカラムに lakebase_ann または lakebase_bm25 インデックスを作成し、運用データと併用してアプリケーションに対して低遅延検索を提供します。 マッピングの設定については、 Lakebase Searchのカスタムタイプマッピングをご覧ください。

必要条件

  • Postgres 16 以降
  • プロジェクトのベータ 版アクセス。 Lakebase Search はベータ版です。Databricks アカウントの担当者にお問い合わせください。
  • プロジェクトで Lakebase Search を有効にすることは元に戻すことができません

プロジェクトにアクセス権が付与されたら、プロジェクト設定で Lakebase Search を有効にします。

  1. Lakebase プロジェクトで、左側のナビゲーションの [設定] をクリックします。
  2. [ Lakebase Search]\(Lakebase 検索\) で、[ Enable Lakebase Search]\(Lakebase 検索を有効にする\) をクリックします。

Warning

Lakebase Search の有効化:

  • プロジェクト内のすべてのコンピューティングを再起動し、アクティブな接続を削除します
  • lakebase_vectorおよびlakebase_text拡張機能をインストールできるようにします
  • 一度有効にした場合はオフにできません

拡張機能のインストール

Lakebase Search を有効にした後、データベースに拡張機能をインストールします。

-- Required: vector search (CASCADE installs pgvector as a dependency)
CREATE EXTENSION IF NOT EXISTS lakebase_vector CASCADE;

-- Required: BM25 full-text search
CREATE EXTENSION IF NOT EXISTS lakebase_text;

概要

次の例では、ベクター列とフルテキスト検索列の両方を含む documents テーブルを作成し、ベクター クエリとキーワード クエリを実行します。

Note

これらの例では、 '[0.1, 0.2, 0.3]' のような小さなリテラル ベクトルを使用して説明します。 実際のアプリケーションでは、埋め込みモデルを使用して外部から埋め込みを生成し、結果を VECTOR 列に格納します。 Databricks では、Model Serving を使用して 埋め込みモデルのクエリ を実行できます 。たとえば、ノートブックや Databricks SQL の ai_query を使用して、結果のベクターを Lakebase に挿入できます。 VECTOR(n)列とインデックスでは、モデルの出力と同じディメンション nを使用する必要があります (通常は 384 から 1536)。

-- Create a table with a vector column and a tsvector column
CREATE TABLE documents (
  id        SERIAL PRIMARY KEY,
  title     TEXT NOT NULL,
  body      TEXT NOT NULL,
  embedding VECTOR(3),
  body_tsv  TSVECTOR
);

-- Create a vector search index
CREATE INDEX ON documents USING lakebase_ann (embedding vector_cosine_ops);

-- Insert sample data and populate the tsvector column
INSERT INTO documents (title, body, embedding, body_tsv) VALUES
  ('Postgres overview', 'Postgres is an open-source relational database.', '[0.1, 0.2, 0.3]', to_tsvector('english', 'Postgres is an open-source relational database.')),
  ('Vector search guide', 'Vector search finds semantically similar results.', '[0.4, 0.5, 0.6]', to_tsvector('english', 'Vector search finds semantically similar results.')),
  ('Full-text search', 'BM25 ranking improves keyword search relevance.', '[0.7, 0.8, 0.9]', to_tsvector('english', 'BM25 ranking improves keyword search relevance.'));

-- Build the BM25 index after inserting data
-- BM25 computes corpus statistics at build time, not incrementally
CREATE INDEX documents_body_bm25 ON documents USING lakebase_bm25 (body_tsv);

-- Vector similarity search
SELECT id, title
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, 0.3]'
LIMIT 5;

-- BM25 keyword search (lower score = more relevant)
SELECT id, title,
  body_tsv <@> to_bm25query(to_tsvector('english', 'database'), 'documents_body_bm25') AS score
FROM documents
ORDER BY score
LIMIT 5;

次のハイブリッド検索の例では、documentsからテーブルとインデックスを再利用します。 各検索から上位の候補を個別に取得し、その後、Reciprocal Rank Fusion(RRF)を使用してそれらを単一のランキングに統合します。いずれか一方または両方の検索で上位にランクされる結果ほど、スコアが高くなります。

WITH vector_ranked AS (
  SELECT id, RANK() OVER (ORDER BY dist) AS rank
  FROM (
    SELECT id, embedding <=> '[0.1, 0.2, 0.3]' AS dist
    FROM documents
    ORDER BY dist
    LIMIT 40
  ) v
),
keyword_ranked AS (
  SELECT id, RANK() OVER (ORDER BY score) AS rank
  FROM (
    SELECT id, body_tsv <@> to_bm25query(to_tsvector('english', 'database'), 'documents_body_bm25') AS score
    FROM documents
    ORDER BY score
    LIMIT 40
  ) k
)
SELECT d.id, d.title,
  COALESCE(1.0 / (60 + v.rank), 0) + COALESCE(1.0 / (60 + k.rank), 0) AS rrf_score
FROM documents d
LEFT JOIN vector_ranked v ON d.id = v.id
LEFT JOIN keyword_ranked k ON d.id = k.id
WHERE v.id IS NOT NULL OR k.id IS NOT NULL
ORDER BY rrf_score DESC, d.id
LIMIT 10;

各 CTE は、独自の上位 40 人の候補を取得します。 RANK() は、同じランクを関連付けられたスコアに割り当てます。 定数 60 は、順位が低い検索結果の影響を弱め、d.id は同順位の場合の順位決定を行い、安定した改ページ位置を実現します。 データのリストごとの LIMIT と RRF 定数を調整します。 重み付けスコアリングなどの他の融合方法も有効です。

拡張機能

Extension Purpose インデックスの種類
lakebase_vector ANN ベクター検索、pgvector 互換 lakebase_ann
lakebase_text BM25 フルテキスト検索、FTS 互換 lakebase_bm25