Creare e gestire un indice BM25

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:

Abilitare l'estensione pg_textsearch

Devi abilitare l'estensione pg_textsearch per ogni database:

  1. Connettiti al database AlloyDB utilizzando psql o un altro client. Per saperne di più, vedi Connettersi a un'istanza del cluster.
  2. 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.

  1. Crea una tabella denominata documents:

    CREATE TABLE documents (
      id SERIAL PRIMARY KEY,
      title TEXT NOT NULL,
      content TEXT NOT NULL
    );
    
  2. 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');
    
  3. 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