BM25-Index erstellen und verwalten

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:

Erweiterung pg_textsearch aktivieren

Sie müssen die Erweiterung pg_textsearch für jede Datenbank aktivieren:

  1. Stellen Sie mit psql oder einem anderen Client eine Verbindung zu Ihrer AlloyDB-Datenbank her. Weitere Informationen finden Sie unter Verbindung zu einer Clusterinstanz herstellen.
  2. 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.

  1. Erstellen Sie eine Tabelle mit dem Namen documents:

    CREATE TABLE documents (
      id SERIAL PRIMARY KEY,
      title TEXT NOT NULL,
      content TEXT NOT NULL
    );
    
  2. 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');
    
  3. 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 ist 1.2.
  • b (optional): Der Normalisierungsparameter für die Dokumentlänge. Der Standardwert ist 0.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.

  • k1 erhöhen: Wenn Sie möchten, dass Suchbegriffe, die mehrmals wiederholt werden, den Wert eines Dokuments immer erhöhen.
  • b erhö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