创建和管理 BM25 索引

本文档介绍了如何创建 BM25(最佳匹配 25)索引,以优化 AlloyDB for PostgreSQL 中的全文搜索。它提供了常见用例的示例,包括排名搜索、配置饱和度参数和调整归一化权重。

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

后续步骤