本文档介绍了如何创建 BM25(最佳匹配 25)索引,以优化 AlloyDB for PostgreSQL 中的全文搜索。它提供了常见用例的示例,包括排名搜索、配置饱和度参数和调整归一化权重。
BM25 是一种概率排名算法,广泛用于估计文档与给定查询的相关性。它会评估词频 (TF)、逆文档频率 (IDF) 和文档长度归一化,以提供比标准文本搜索更准确的搜索排名。
准备工作
如需使用 BM25 索引,您必须启用 pg_textsearch 扩展程序并满足以下要求:
- 使用 PostgreSQL 17 或 18:
pg_textsearch扩展程序仅在运行 PostgreSQL 主要版本 17 或 18 的 AlloyDB 实例上受支持。 - 数据库角色:您必须具有
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);
后续步骤
- 了解全文搜索。
- 了解如何运行混合向量相似性搜索。