建立及管理 BM25 索引

AlloyDB for PostgreSQL 支援 Best Matching 25 (BM25) 索引,可讓您透過高準確度的關聯性排名,最佳化全文檢索搜尋查詢。您可以啟用 pg_textsearch 擴充功能來建立 BM25 索引、排列搜尋結果、設定字詞頻率飽和度參數,以及調整文件長度正規化權重。

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);

後續步驟