BM25 インデックスを作成して管理する

このドキュメントでは、AlloyDB for PostgreSQL で全文検索を最適化するために BM25(Best Matching 25)インデックスを作成する方法について説明します。検索のランキング、飽和パラメータの構成、正規化の重みの調整など、一般的なユースケースの例を示します。

BM25 は、ドキュメントが特定のクエリにどの程度関連しているかを推定するために広く使用されている確率的ランキング アルゴリズムです。単語の頻度(TF)、逆文書頻度(IDF)、文書の長さの正規化を評価し、標準のテキスト検索よりも正確な検索ランキングを提供します。

始める前に

BM25 インデックスを使用するには、pg_textsearch 拡張機能を有効にして、次の要件を満たす必要があります。

pg_textsearch 拡張機能を有効にする

データベースごとに pg_textsearch 拡張機能を有効にする必要があります。

  1. psql または別のクライアントを使用して AlloyDB データベースに接続します。詳細については、クラスタ インスタンスに接続するをご覧ください。
  2. 次の SQL コマンドを実行して、拡張機能を作成します。

    CREATE EXTENSION IF NOT EXISTS pg_textsearch;
    

BM25 インデックスを作成する

次の例では、BM25 類似性クエリのテキストデータをインデックス登録するコンテンツ column を含む documents というテーブルを作成します。

  1. documents という名前のテーブルを作成します。

    CREATE TABLE documents (
      id SERIAL PRIMARY KEY,
      title TEXT NOT NULL,
      content TEXT NOT NULL
    );
    
  2. テーブルにサンプルデータを入力します。

    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. content 列に BM25 インデックスを作成します。

    CREATE INDEX idx_docs_bm25
    ON documents
    USING bm25 (content)
    WITH (text_config = 'english');
    

インデックスの WITH 句では、次の 3 つのパラメータがサポートされています。

  • text_config(必須): 使用する PostgreSQL テキスト検索構成(english など)。
  • k1(省略可): 用語の頻度飽和パラメータ。デフォルト値は 1.2 です。
  • b(省略可): ドキュメントの長さの正規化パラメータ。デフォルト値は 0.75 です。

BM25 インデックスを使用したクエリ

BM25 インデックスに対して関連性ランキングを実行するには、<@> 演算子を使用します。

<@> 演算子は負の BM25 スコアを返します。これは、PostgreSQL が演算子での昇順(ASC)インデックス スキャンのみをサポートしているためです。スコアが低い(負の値が大きい)ほど、関連性の高い一致であることを示します。

BM25 スコアの昇順で並べ替えられた検索クエリを実行します。

SELECT title, content, content <@> 'database system' AS score
FROM documents
ORDER BY content <@> 'database system' ASC
LIMIT 5;

出力には、関連性の高いドキュメントが最も低い負のスコアで上部に表示されます。

      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 インデックス パラメータをチューニングする

パラメータを調整して、さまざまなタイプのドキュメント コレクションのランキングを最適化できます。

  • k1 を増やす: クエリ用語が複数回繰り返された場合に、ドキュメントのスコアを常に増やす場合。
  • b を増やす: 長いドキュメントに雑多な用語が含まれている場合に、より重いペナルティを課したい場合。

短いドキュメント用にカスタマイズされた、単語の頻度を優先するインデックスを作成するには、k11.5 に、b0.8 に設定します。

CREATE INDEX idx_docs_bm25_tuned
ON documents
USING bm25 (content)
WITH (text_config = 'english', k1 = 1.5, b = 0.8);

次のステップ