Ce document explique comment créer des index BM25 (Best Matching 25) pour optimiser la recherche en texte intégral dans AlloyDB pour PostgreSQL. Il fournit des exemples pour les cas d'utilisation courants, y compris le classement des recherches, la configuration des paramètres de saturation et le réglage des pondérations de normalisation.
BM25 est un algorithme de classement probabiliste largement utilisé pour estimer la pertinence d'un document par rapport à une requête donnée. Il évalue la fréquence des termes (TF), la fréquence inverse des documents (IDF) et la normalisation de la longueur des documents pour offrir des classements de recherche plus précis que la recherche de texte standard.
Avant de commencer
Pour utiliser un index BM25, vous devez activer l'extension pg_textsearch et répondre aux exigences suivantes :
- Utilisez PostgreSQL 17 ou 18 : l'extension
pg_textsearchn'est compatible qu'avec les instances AlloyDB exécutant la version majeure 17 ou 18 de PostgreSQL. - Rôle de base de données : vous devez disposer du
alloydbsuperuserrôle de base de données. Pour en savoir plus, consultez la page Ajouter un compte d'utilisateur ou de service IAM à un cluster.
Activer l'extension pg_textsearch
Vous devez activer l'extension pg_textsearch pour chaque base de données :
- Connectez-vous à votre base de données AlloyDB à l'aide de
psqlou d'un autre client. Pour en savoir plus, consultez la page Se connecter à une instance de cluster. Exécutez la commande SQL suivante pour créer l'extension :
CREATE EXTENSION IF NOT EXISTS pg_textsearch;
Créer un index BM25
L'exemple suivant crée une table nommée documents avec une column
de contenu pour indexer les données de texte pour les requêtes de similarité BM25.
Créez une table nommée
documents:CREATE TABLE documents ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL );Remplissez la table avec des exemples de données :
INSERT INTO documents (title, content) VALUES ('Database systems', 'AlloyDB is a fully managed PostgreSQL-compatible database service'), ('Google Cloud FTS', 'Full-text search lets you identify natural-language documents'), ('Probabilistic Ranking', 'BM25 uses term frequency and document length normalization');Créez un index BM25 sur la colonne
content:CREATE INDEX idx_docs_bm25 ON documents USING bm25 (content) WITH (text_config = 'english');
L'index accepte trois paramètres dans sa clause WITH :
text_config(obligatoire) : configuration de recherche de texte PostgreSQL à utiliser (par exemple,english).k1(facultatif) : paramètre de saturation de la fréquence des termes. La valeur par défaut est1.2.b(facultatif) : paramètre de normalisation de la longueur des documents. La valeur par défaut est0.75.
Interroger à l'aide d'un index BM25
Pour effectuer un classement par pertinence par rapport à un index BM25, utilisez l'opérateur <@>.
L'opérateur <@> renvoie un score BM25 négatif. En effet, PostgreSQL n'accepte que les analyses d'index ascendantes (ASC) sur les opérateurs. Un score plus faible (plus négatif) indique une meilleure correspondance de pertinence.
Exécutez une requête de recherche triée par score BM25 par ordre croissant :
SELECT title, content, content <@> 'database system' AS score
FROM documents
ORDER BY content <@> 'database system' ASC
LIMIT 5;
Le résultat affiche le document très pertinent en haut avec le score négatif le plus bas :
title | content | score
------------------+----------------------------------------------------------------------+----------
Database systems | AlloyDB is a fully managed PostgreSQL-compatible database service | -0.9971461892127991
Google Cloud FTS | Full-text search lets you identify natural-language documents | 0
Probabilistic ranking | BM25 uses term frequency and document length normalization | 0
(3 rows)
Régler les paramètres de l'index BM25
Vous pouvez ajuster les paramètres pour optimiser le classement de différents types de collections de documents.
- Augmentez
k1si vous souhaitez que les termes de requête répétés plusieurs fois augmentent systématiquement le score d'un document. - Augmentez
bsi vous souhaitez que les documents plus longs soient plus fortement pénalisés pour inclure des termes divers.
Pour créer un index personnalisé pour les documents courts qui privilégient la fréquence des termes, définissez k1 sur 1.5 et b sur 0.8 :
CREATE INDEX idx_docs_bm25_tuned
ON documents
USING bm25 (content)
WITH (text_config = 'english', k1 = 1.5, b = 0.8);
Étape suivante
- En savoir plus sur la recherche en texte intégral.
- Découvrez comment exécuter une recherche hybride de similarité vectorielle.