建立及管理 BM25 索引

本文說明如何在 AlloyDB for PostgreSQL 中建立 BM25 (最佳比對 25) 索引,藉此最佳化全文搜尋。這份指南提供常見用途的範例,包括搜尋排名、設定飽和度參數,以及調整正規化權重。

BM25 是一種機率排名演算法,廣泛用於估算文件與特定查詢的相關程度。這項功能會評估字詞頻率 (TF)、逆向文件頻率 (IDF) 和文件長度正規化,提供比標準文字搜尋更準確的搜尋排名。

事前準備

如要使用 BM25 索引,請啟用 pg_textsearch 擴充功能,並符合下列規定:

啟用 pg_textsearch 擴充功能

您必須為每個資料庫啟用 pg_textsearch 擴充功能:

  1. 使用 psql 或其他用戶端連線至 AlloyDB 資料庫。詳情請參閱「連線至叢集執行個體」。
  2. 執行下列 SQL 指令,建立擴充功能:

    CREATE EXTENSION IF NOT EXISTS pg_textsearch;
    

建立 BM25 索引

下列範例會建立名為 documents 的資料表,並使用 column 內容為 BM25 相似度查詢建立文字資料索引。

  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 子句支援三個參數:

  • 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:如果希望文件包含雜項條款時,受到更嚴重的處罰。

如要建立專為短文件設計的索引,並優先考量字詞頻率,請將 k1 設為 1.5,並將 b 設為 0.8

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

後續步驟