本文說明如何在 AlloyDB for PostgreSQL 中建立 BM25 (最佳比對 25) 索引,藉此最佳化全文搜尋。這份指南提供常見用途的範例,包括搜尋排名、設定飽和度參數,以及調整正規化權重。
BM25 是一種機率排名演算法,廣泛用於估算文件與特定查詢的相關程度。這項功能會評估字詞頻率 (TF)、逆向文件頻率 (IDF) 和文件長度正規化,提供比標準文字搜尋更準確的搜尋排名。
事前準備
如要使用 BM25 索引,請啟用 pg_textsearch 擴充功能,並符合下列規定:
- 使用 PostgreSQL 17 或 18:只有執行 PostgreSQL 主要版本 17 或 18 的 AlloyDB 執行個體,才支援
pg_textsearch擴充功能。 - 資料庫角色:您必須具備
alloydbsuperuser資料庫角色。詳情請參閱「將 IAM 使用者或服務帳戶新增至叢集」。
啟用 pg_textsearch 擴充功能
您必須為每個資料庫啟用 pg_textsearch 擴充功能:
- 使用
psql或其他用戶端連線至 AlloyDB 資料庫。詳情請參閱「連線至叢集執行個體」。 執行下列 SQL 指令,建立擴充功能:
CREATE EXTENSION IF NOT EXISTS pg_textsearch;
建立 BM25 索引
下列範例會建立名為 documents 的資料表,並使用 column 內容為 BM25 相似度查詢建立文字資料索引。
建立名為
documents的資料表:CREATE TABLE documents ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL );在資料表中填入範例資料:
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');在
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);
後續步驟
- 瞭解全文搜尋。
- 瞭解如何執行混合型向量相似度搜尋。