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