Questo documento mostra come creare indici BM25 (Best Matching 25) per ottimizzare la ricerca full-text in AlloyDB per PostgreSQL. Fornisce esempi per casi d'uso comuni, tra cui la classificazione delle ricerche, la configurazione dei parametri di saturazione e la regolazione dei pesi di normalizzazione.
BM25 è un algoritmo di classificazione probabilistico ampiamente utilizzato per stimare la pertinenza di un documento rispetto a una determinata query. Valuta la frequenza dei termini (TF), la frequenza inversa dei documenti (IDF) e la normalizzazione della lunghezza dei documenti per offrire classifiche di ricerca più accurate rispetto alla ricerca di testo standard.
Prima di iniziare
Per utilizzare un indice BM25, devi abilitare l'estensione pg_textsearch e soddisfare i seguenti requisiti:
- Utilizza PostgreSQL 17 o 18: l'estensione
pg_textsearchè supportata solo sulle istanze AlloyDB che eseguono la versione principale 17 o 18 di PostgreSQL. - Ruolo del database: devi avere il ruolo del database
alloydbsuperuser. Per saperne di più, vedi Aggiungere un utente IAM o un account di servizio a un cluster.
Abilitare l'estensione pg_textsearch
Devi abilitare l'estensione pg_textsearch per ogni database:
- Connettiti al database AlloyDB utilizzando
psqlo un altro client. Per saperne di più, vedi Connettersi a un'istanza del cluster. Esegui il seguente comando SQL per creare l'estensione:
CREATE EXTENSION IF NOT EXISTS pg_textsearch;
Creare un indice BM25
L'esempio seguente crea una tabella denominata documents con una column di contenuti per indicizzare i dati di testo per le query di somiglianza BM25.
Crea una tabella denominata
documents:CREATE TABLE documents ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL );Popola la tabella con dati di esempio:
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');Crea un indice BM25 nella colonna
content:CREATE INDEX idx_docs_bm25 ON documents USING bm25 (content) WITH (text_config = 'english');
L'indice supporta tre parametri nella clausola WITH:
text_config(obbligatorio): la configurazione di ricerca di testo di PostgreSQL da utilizzare (ad esempio,english).k1(facoltativo): il parametro di saturazione della frequenza dei termini. Il valore predefinito è1.2.b(facoltativo): il parametro di normalizzazione della lunghezza dei documenti. Il valore predefinito è0.75.
Eseguire query utilizzando un indice BM25
Per eseguire la classificazione della pertinenza rispetto a un indice BM25, utilizza l'operatore <@>.
L'operatore <@> restituisce un punteggio BM25 negativo. Questo perché PostgreSQL supporta solo le scansioni degli indici in ordine crescente (ASC) sugli operatori. Un punteggio inferiore (più negativo) indica una corrispondenza di pertinenza più forte.
Esegui una query di ricerca ordinata per punteggio BM25 in ordine crescente:
SELECT title, content, content <@> 'database system' AS score
FROM documents
ORDER BY content <@> 'database system' ASC
LIMIT 5;
L'output mostra il documento altamente pertinente in alto con il punteggio negativo più basso:
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)
Regolare i parametri dell'indice BM25
Puoi modificare i parametri per ottimizzare la classificazione per diversi tipi di raccolte di documenti.
- Aumenta
k1: se vuoi che i termini di query ripetuti più volte aumentino costantemente il punteggio di un documento. - Aumenta
b: se vuoi che i documenti più lunghi vengano penalizzati maggiormente per l'inclusione di termini vari.
Per creare un indice personalizzato per i documenti brevi che danno la priorità alla frequenza dei termini, imposta k1 su 1.5 e b su 0.8:
CREATE INDEX idx_docs_bm25_tuned
ON documents
USING bm25 (content)
WITH (text_config = 'english', k1 = 1.5, b = 0.8);
Passaggi successivi
- Scopri di più sulla ricerca full-text.
- Scopri come eseguire una ricerca di somiglianza vettoriale ibrida.