lakebase_text

L’extension lakebase_text ajoute la recherche en texte intégral BM25 à Lakebase via le type d’index lakebase_bm25 . Il est compatible avec les opérateurs de requête et de type standard tsvector de PostgreSQL.

Installer

Tout d’abord, activez La recherche Lakebase dans les paramètres de votre projet. Installez ensuite l’extension :

CREATE EXTENSION IF NOT EXISTS lakebase_text;

Mise à niveau de l’extension et des index

Une nouvelle version de Lakebase Search peut ajouter des fonctionnalités, des correctifs et des améliorations de performance. Bien que Lakebase Search soit publié dans le cadre des mises à jour Lakebase, il ne met pas tout à jour automatiquement. Dans lakebase_text, deux choses sont mises à jour séparément et portent des numéros de version qui ne sont pas liés entre eux :

  • La version extension est la version des objets SQL qui CREATE EXTENSION lakebase_text crée, y compris ses types de données, fonctions, opérateurs et la méthode d’accès à l’index lakebase_bm25 . Cette version est rapportée par SELECT installed_version FROM pg_available_extensions WHERE name = 'lakebase_text'. ALTER EXTENSION lakebase_text UPDATE Mise à jour de cette version.
  • Le format de stockage d’index est la disposition sur disque d’un lakebase_bm25 index. L’extension pourrait introduire des formats de stockage indexés mis à jour dans une mise à jour, débloquant davantage de fonctionnalités et offrant de meilleures performances. Tous les nouveaux index créés utilisent automatiquement le dernier format de stockage, tandis que les index existants peuvent être mis à niveau vers le nouveau format après REINDEX INDEX CONCURRENTLY qu’un nouveau format de stockage soit disponible.

La mise à niveau n’est pas urgente. L’extension est compatible avec les objets SQL et les formats de stockage indexés des versions précédentes, mais rester à jour vous permet de suivre le chemin supporté et le mieux performant et d’éviter une migration plus importante ultérieure, donc mettez à jour quand cela vous convient plutôt que de reporter indéfiniment.

Note

La dernière version d’extension disponible est rapportée par SELECT default_version FROM pg_available_extensions WHERE name = 'lakebase_text'.

La recherche en texte intégral intégrée de PostgreSQL utilise des index GIN et ts_rank pour le scoring de pertinence. ts_rank n’utilise pas les statistiques globales du corpus, de sorte que les scores se dégradent à mesure que les données augmentent. lakebase_text améliore cela de deux manières :

  • Les comptes de classement BM25 pour la fréquence des termes, la longueur du document et les statistiques à l’échelle du corpus simultanément, produisant des scores de pertinence plus précis que TF-IDF.
  • Top-K pushdown utilise Block-Max WAND pour retourner uniquement les résultats les plus pertinents de l’index, sans marquer chaque correspondance dans le jeu de résultats.

Démarrage rapide

Générez l’index lakebase_bm25 après l’insertion de données. BM25 calcule les statistiques à l’échelle du corpus au moment de la génération d’index, et non de façon incrémentielle, de sorte que l’index doit être créé sur une table remplie.

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

L’opérateur <@> retourne un score BM25 négatif. L’ordre par score croissant retourne d’abord les résultats les plus pertinents.

Note

Un lakebase_bm25 balayage d’indice peut omettre n’importe quel nombre de lignes dont <@> la valeur est exactement 0.0. Ne comptez pas sur le retour des rangées à distance zéro ni sur leur ordre. Pour évaluer chaque ligne, réglez lakebase_bm25.enable_scan sur off utiliser un balayage séquentiel à la place.

Peupler à partir de tables synchronisées

Si vous chargez le texte source depuis le catalogue Unity au lieu de l’insérer directement, les tables synchronisées peuvent générer une tsvector colonne pendant la synchronisation, prête à être indexée lakebase_bm25 dès que la synchronisation est terminée. Voir Mappage personnalisé de types pour la recherche Lakebase.

Conserver l’index exact

Les statistiques BM25 sont calculées au moment de la génération d’index et mises à jour par VACUUM. Pour la plupart des charges de travail, les scores sont réguliers VACUUM . Après le chargement en bloc d’une grande quantité de nouvelles données, exécutez VACUUM manuellement :

VACUUM documents;

Pour maintenir la requête et mettre à jour les performances, VACUUM il faut nettoyer rapidement l’index. Pour un tableau dédié à la recherche textuelle, Databricks recommande de définir autovacuum_vacuum_insert_scale_factor pour 0 que le seuil d’autovide déclenché par insertion ne croît pas avec la table :

ALTER TABLE documents SET (
  autovacuum_vacuum_insert_scale_factor = 0
);

Avec le facteur d’échelle fixé à 0, autovacuum_vacuum_insert_threshold détermine le nombre fixe de tuples insérés qui déclenche l’autovide. Ajuste ce seuil en fonction de ta charge de travail.

Warning

Les statistiques globales de BM25 ne sont pas versionnées en MVCC. Si VACUUM les statistiques sont mises à jour alors qu’une transaction utilise un ancien instantané MVCC, la transaction peut calculer les scores à partir de statistiques plus récentes que son instantané de ligne. La visibilité des lignes reste conforme au MVCC, mais les scores, les classements et les résultats du top K peuvent changer au sein d’une REPEATABLE READ transaction. Ne vous fiez pas à des classements BM25 stables en instantanés sur un concurrent VACUUM, y compris l’autovacuum.

GuCs au niveau de la session

Paramètre Type Default Description
lakebase_bm25.default_limit entier 1000 Nombre maximal de résultats retournés à partir de l’index.
lakebase_bm25.prefilter booléen false Quand true, évalue les WHERE conditions avant de calculer les scores BM25. Utilisez quand les filtres éliminent de nombreuses lignes et sont bon marché pour évaluer.
lakebase_bm25.enable_scan booléen true Définissez cette option pour false forcer une analyse séquentielle, en contournant l’index. Utile pour les tests.
SET lakebase_bm25.default_limit TO 20;
SET lakebase_bm25.prefilter = on;

Les guCs sont prioritaires sur les paramètres de stockage d’index lorsque les deux sont définis.

Paramètres de stockage d’index

Définissez ces options au moment de la création d’index ou avec ALTER INDEX:

Paramètre Type Default Plage Description
k1 real 1.2 1.2 à 2.0 Saturation de la fréquence des termes. Les valeurs plus élevées donnent plus de poids aux termes répétés.
b real 0.75 0.0 à 1.0 Normalisation de la longueur du document. 0.0 désactive la normalisation de longueur ; 1.0 applique la normalisation complète.
default_limit entier 1000 1 à 65535 Limite de secours lorsque le GUC de session n’est pas défini.
prefilter booléen false N/A Paramètre de préfiltrage de secours lorsque le GUC de session n’est pas défini.
-- 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);

Référence d’API

Types

bm25query_tsvector: combine une requête tsvector avec l’identificateur d’index cible. Utilisé comme opérande droit de <@>.

Opérateurs

Opérateur Signature Returns Description
<@> tsvector <@> bm25query_tsvector double precision Retourne un score BM25 négatif. Ordre croissant pour obtenir d’abord les résultats les plus pertinents.

Functions

Fonction Returns Description
to_bm25query(query tsvector, index regclass) bm25query_tsvector Construit un objet de requête BM25 à partir d’un tsvector identificateur d’objet et de l’index.

Classes d’opérateurs

Classe Valeur par défaut pour Description
tsvector_bm25_ops tsvector Mappe les tsvector colonnes à l’opérateur pour le <@> scoring BM25. Il s’agit de la classe d’opérateur par défaut pour tsvector laquelle lakebase_bm25vous n’avez pas besoin de la spécifier explicitement.

Étapes suivantes