Recherche Lakebase

Important

Cette fonctionnalité est en version bêta. Les administrateurs d’espace de travail peuvent contrôler l’accès à cette fonctionnalité à partir de la page Aperçus . Consultez Gérer les préversions d’Azure Databricks.

Lakebase Search ajoute un système hybride de recherche vectorielle et mot-clé aux projets Lakebase. Activez-le une fois dans les paramètres de votre projet, puis installez les lakebase_vectorlakebase_text extensions Postgres pour commencer à créer des fonctionnalités de recherche.

Lakebase Search fournit deux méthodes de recherche complémentaires. Utilisez-les par elle-même ou combinez-les pour la recherche hybride :

  • La recherche vector (sémantique) recherche des lignes dont la signification est la plus proche de votre requête, même lorsqu’elles ne partagent aucun mot. Vous effectuez une requête à l’aide d’un embedding (un vecteur numérique produit par un modèle), et l’indice renvoie les vecteurs les plus proches selon la distance. Utilisez-le pour les questions, recommandations et génération augmentée de récupération (RAG) en langage naturel. Alimenté par lakebase_vector.
  • La recherche par mot clé (texte intégral) classe les lignes en fonction de leur niveau de correspondance avec les termes exacts de votre requête, à l’aide du scoring de pertinence BM25. Utilisez-le pour les noms, les codes et les recherches exactes dans lesquelles la formulation est importante. Alimenté par lakebase_text.
  • La recherche hybride exécute à la fois des recherches et combine les résultats dans une liste classée, de sorte que vous obtenez des correspondances sémantiquement similaires et exactes. Utilisez-la lorsque les requêtes combinent l’intention avec des termes spécifiques, le cas le plus courant dans la recherche réelle.

Recherche par mots-clés ou recherche vectorielle pour la requête « voiture de sport rapide ». La recherche par mots-clés (lakebase_text) ne renvoie que les documents contenant les mots saisis et passe à côté de synonymes comme « voiture rapide » et « Ferrari 488 supercar ». La recherche vectorielle (lakebase_vector) place la requête et les documents dans le même espace de plongement et renvoie les plus proches voisins sur le plan sémantique, y compris ces synonymes.

Fonctionnement

Sous le capot, Lakebase Search repose sur deux extensions Postgres :

  • lakebase_vector ajoute une recherche de vecteur proche approximative (ANN) par le biais du type d’index lakebase_ann . Il s’agit d’un compagnon de dépôt pour pgvector : les mêmes types de vecteurs, opérateurs de distance et syntaxe de requête fonctionnent sans modification. En interne, il utilise le partitionnement IVF avec la quantification RaBitQ, qui prend en charge des index contenant plus d’un milliard de vecteurs dans un seul index et permet de les construire jusqu’à 50 à 100 fois plus rapidement que HNSW. Les index sont adossés au stockage et restent disponibles après un scale-to-zero, sans phase de préchauffage.

  • lakebase_text ajoute la recherche en texte intégral BM25 via le type d’index lakebase_bm25 . Il est compatible avec les types standard tsvector et les opérateurs de requête de PostgreSQL. Le classement BM25 prend en compte simultanément la fréquence des termes, la longueur du document et les statistiques globales du corpus. Top-K pushdown (Block-Max WAND) récupère uniquement les K résultats les plus pertinents depuis l’index, au lieu d’attribuer un score à chaque correspondance.

Vous pouvez proposer la recherche sur des données provenant du lakehouse, et pas seulement sur des données écrites directement dans Postgres. Utilisez des tables synchronisées pour synchroniser une table du catalogue Unity dans Lakebase, et mappez ses colonnes aux types Postgres prêts à la recherche pendant la synchronisation :

Une fois la synchronisation terminée, créez un index lakebase_ann ou lakebase_bm25 sur la colonne synchronisée et fournissez à vos applications une recherche à faible latence aux côtés de vos données opérationnelles. Pour la configuration du mappage, voir Mappage de types personnalisé pour Lakebase Search.

Requirements

  • Postgres 16 ou version ultérieure
  • Accès bêta pour votre projet. La recherche Lakebase est en version bêta ; contactez votre représentant de compte Databricks pour le demander.
  • L’activation de la recherche Lakebase sur un projet est irréversible

Une fois que votre projet a accès, activez La recherche Lakebase dans les paramètres de votre projet :

  1. Dans votre projet Lakebase, cliquez sur Paramètres dans le volet de navigation gauche.
  2. Sous Recherche Lakebase, cliquez sur Activer la recherche Lakebase.

Warning

Activation de la recherche Lakebase :

  • Redémarre tous les calculs de votre projet, en supprimant toutes les connexions actives
  • Rend les extensions lakebase_vector et lakebase_text disponibles à l’installation
  • Impossible de désactiver une fois activé

Installer les extensions

Après avoir activé La recherche Lakebase, installez les extensions dans votre base de données :

-- 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;

Get started

L’exemple suivant crée une table avec une documents colonne vectorielle et une colonne de recherche en texte intégral, puis exécute des requêtes de vecteur et de mot clé :

Note

Ces exemples utilisent de petits vecteurs littéraux comme '[0.1, 0.2, 0.3]' pour l’illustration. Dans une application réelle, générez des incorporations en externe avec un modèle d’incorporation, puis stockez le résultat dans la VECTOR colonne. Sur Databricks, vous pouvez interroger un modèle d’incorporation à l’aide de Model Serving ( par exemple, ai_query dans un notebook ou Databricks SQL), puis insérer les vecteurs résultants dans Lakebase. La VECTOR(n) colonne et l’index doivent utiliser la même dimension n que la sortie de votre modèle (généralement 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;

L’exemple de recherche hybride suivant réutilise la table documents et les index de Get started. Il récupère indépendamment les meilleurs candidats de chaque recherche, puis les combine en un classement unique à l’aide de la méthode Reciprocal Rank Fusion (RRF) : les résultats bien classés dans l’une ou l’autre des recherches, ou dans les deux, obtiennent un score plus élevé.

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;

Chaque CTE récupère ses propres 40 meilleurs candidats. RANK() attribue le même rang aux scores liés. La constante 60 amortit l’influence des résultats classés bas et d.id interrompt les liens pour la pagination stable. Ajustez le LIMIT par liste ainsi que la constante RRF pour vos données. D’autres méthodes de fusion, telles que le scoring pondéré, sont également valides.

Extensions

Extension Purpose Type d’index
lakebase_vector Recherche vectorielle ANN, compatible avec pgvector lakebase_ann
lakebase_text Recherche en texte intégral BM25, compatible FTS lakebase_bm25