In diesem Dokument erfahren Sie, wie Sie BM25-Indexe (Best Matching 25) erstellen, um die Volltextsuche in AlloyDB for PostgreSQL zu optimieren. Es enthält Beispiele für häufige Anwendungsfälle, darunter das Ranking von Suchanfragen, das Konfigurieren von Sättigungsparametern und das Optimieren von Normalisierungsgewichten.
BM25 ist ein probabilistischer Ranking-Algorithmus, der häufig verwendet wird, um die Relevanz eines Dokuments für eine bestimmte Suchanfrage zu schätzen. Er wertet die Term Frequency (TF), die Inverse Document Frequency (IDF) und die Normalisierung der Dokumentlänge aus, um genauere Suchergebnisse als die Standardsuche zu liefern.
Hinweis
Wenn Sie einen BM25-Index verwenden möchten, müssen Sie die Erweiterung pg_textsearch aktivieren und die folgenden Anforderungen erfüllen:
- PostgreSQL 17 oder 18 verwenden: Die Erweiterung
pg_textsearchwird nur auf AlloyDB-Instanzen unterstützt, auf denen PostgreSQL Hauptversion 17 oder 18 ausgeführt wird. - Datenbankrolle: Sie müssen die
alloydbsuperuserDatenbankrolle haben. Weitere Informationen finden Sie unter IAM-Nutzer oder Dienstkonto zu einem Cluster hinzufügen.
Erweiterung pg_textsearch aktivieren
Sie müssen die Erweiterung pg_textsearch für jede Datenbank aktivieren:
- Stellen Sie mit
psqloder einem anderen Client eine Verbindung zu Ihrer AlloyDB-Datenbank her. Weitere Informationen finden Sie unter Verbindung zu einer Clusterinstanz herstellen. Führen Sie den folgenden SQL-Befehl aus, um die Erweiterung zu erstellen:
CREATE EXTENSION IF NOT EXISTS pg_textsearch;
BM25-Index erstellen
Im folgenden Beispiel wird eine Tabelle mit dem Namen documents mit einer column für Inhalte erstellt, um Textdaten für BM25-Ähnlichkeitsabfragen zu indexieren.
Erstellen Sie eine Tabelle mit dem Namen
documents:CREATE TABLE documents ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL );Füllen Sie die Tabelle mit Beispieldaten:
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');Erstellen Sie einen BM25-Index für die Spalte
content:CREATE INDEX idx_docs_bm25 ON documents USING bm25 (content) WITH (text_config = 'english');
Der Index unterstützt drei Parameter in der WITH-Klausel:
text_config(erforderlich): Die zu verwendende PostgreSQL-Textsuchkonfiguration (z. B.english).k1(optional): Der Sättigungsparameter für die Termfrequenz. Der Standardwert ist1.2.b(optional): Der Normalisierungsparameter für die Dokumentlänge. Der Standardwert ist0.75.
Abfrage mit einem BM25-Index
Verwenden Sie den Operator <@>, um ein Relevanzranking für einen BM25-Index durchzuführen.
Der Operator <@> gibt einen negativen BM25-Wert zurück. Das liegt daran, dass PostgreSQL nur aufsteigende (ASC) Indexscans für Operatoren unterstützt. Ein niedrigerer (negativerer) Wert deutet auf eine stärkere Relevanzübereinstimmung hin.
Führen Sie eine Suchanfrage aus, die nach BM25-Wert in aufsteigender Reihenfolge sortiert ist:
SELECT title, content, content <@> 'database system' AS score
FROM documents
ORDER BY content <@> 'database system' ASC
LIMIT 5;
In der Ausgabe wird das höchst relevante Dokument oben mit dem niedrigsten negativen Wert angezeigt:
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)
BM25-Indexparameter optimieren
Sie können Parameter anpassen, um das Ranking für verschiedene Arten von Dokumentsammlungen zu optimieren.
k1erhöhen: Wenn Sie möchten, dass Suchbegriffe, die mehrmals wiederholt werden, den Wert eines Dokuments immer erhöhen.berhöhen: Wenn Sie möchten, dass längere Dokumente stärker dafür bestraft werden, dass sie verschiedene Begriffe enthalten.
Wenn Sie einen Index erstellen möchten, der für kurze Dokumente angepasst ist und die Termfrequenz priorisiert, legen Sie k1 auf 1.5 und b auf 0.8 fest:
CREATE INDEX idx_docs_bm25_tuned
ON documents
USING bm25 (content)
WITH (text_config = 'english', k1 = 1.5, b = 0.8);
Nächste Schritte
- Weitere Informationen zur Volltextsuche.
- Informationen zum Ausführen einer hybriden Vektorähnlichkeitssuche.