维护向量索引

本页介绍了维护向量索引的选项。维护索引有助于确保索引能够适应可能影响搜索结果准确率的数据变化。随着数据集不断增长,请使用本页面中的策略来避免查询性能下降。

准备工作

  • 安装或更新 vectoralloydb_scann 扩展程序。

    1. 如果未安装 vectoralloydb_scann 扩展程序,请安装最新的扩展程序版本。

      CREATE EXTENSION IF NOT EXISTS vector;
      CREATE EXTENSION IF NOT EXISTS alloydb_scann;
      
    2. 如果 vectoralloydb_scann 扩展程序已安装,请将这些扩展程序升级到最新版本。

      ALTER EXTENSION vector UPDATE;
      ALTER EXTENSION alloydb_scann UPDATE;
      

查看向量索引指标

如果您的表容易频繁更新或插入,我们建议您定期重新编制现有的 ScaNN 索引,以提高索引的召回率准确率。您可以监控索引指标,以查看自构建索引以来向量分布或向量变更的变化,然后相应地重新编制索引。

如需详细了解指标,请参阅查看向量索引指标

自动维护索引

在创建 ScaNN 索引时,您可以使用 scann.enable_preview_features 数据库标志 (GUC) 以及索引级 auto_maintenance 参数。同时使用这些设置可让 AlloyDB 逐步管理索引,以便在数据集不断增长时,它会拆分大型离群值分区。通过拆分分区,AlloyDB 尝试提供更好的 QPS 和搜索结果。

由于自动维护而对索引所做的任何更新都是永久性的,直到 AlloyDB 再次更新索引。

如需让 AlloyDB 自动维护索引,请启用 scann.enable_preview_features 标志:

gcloud alloydb instances update INSTANCE_ID \
     --database-flags scann.enable_preview_features=on \
     --region=REGION_ID \
     --cluster=CLUSTER_ID \
     --project=PROJECT_ID

替换以下内容:

  • INSTANCE_ID:实例的 ID。
  • REGION_ID:实例所在的区域,例如 us-central1
  • CLUSTER_ID:实例所在集群的 ID。
  • PROJECT_ID:集群所在项目的 ID。

启用 scann.enable_preview_features 标志后,您可以为索引启用自动维护,也可以启用 scann_index_maintenance 函数以手动调用维护。

在创建索引期间启用自动维护

如需创建启用了自动维护的 ScaNN 索引,请运行以下示例命令:

CREATE INDEX INDEX_NAME ON TABLE
  USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (num_leaves=NUM_LEAVES_VALUE, auto_maintenance=on);

替换以下内容:

  • INDEX_NAME:要创建的索引的名称,例如 my-scann-index。索引名称会在整个数据库中共享。确保每个索引名称对数据库中的每个表中都是唯一的。

  • TABLE:要向其中添加索引的表。

  • EMBEDDING_COLUMN:用于存储 vector 数据的列。

  • DISTANCE_FUNCTION:要与此索引一起使用的距离函数。请按以下方式之一操作:

    • L2 距离:l2

    • 点积:dot_product

    • 余弦距离:cosine

  • NUM_LEAVES_VALUE:要应用于此索引的分区数量。设置为介于 1 到 1048576 之间的任意值。如需详细了解如何确定此值,请参阅ScaNN 索引进行调优

管理用于自动搜索拆分分区的叶

如果您已启用索引自动维护,则 AlloyDB 会在达到 num_leaves 阈值时自动拆分分区。随着这些拆分导致分区的数量增加,您应调整要搜索的叶数量,以保持最佳性能。

如需自动管理要搜索的叶数量,请使用 pct_leaves_to_search。此参数可让您指定要搜索的分区数量所占的百分比。如果您预计数据集会大幅增长,请先将 pct_leaves_to_search 值设置为 1。默认情况下,此参数处于已停用状态。

将此值设置为当前分区数量所占的百分比。例如,如需搜索当前分区数量的 1%,请将此值设置为 1

您可以将此参数设置为 0100 之间的任何值。默认值为 0,这会停用此参数并使用 scann.num_leaves_to_search 计算要搜索的叶数量。

如需在数据库上设置 pct_leaves_to_search 标志,请运行以下命令:

ALTER DATABASE DATABASE_NAME SET scann.pct_leaves_to_search = PERCENTAGE_LEAVES_TO_SEARCH;

替换以下内容:

  • DATABASE_NAME:数据库的名称。
  • PERCENTAGE_LEAVES_TO_SEARCH:要搜索的 num_leaves 的百分比。

手动调用维护

如果您想按需对特定索引调用维护,请运行以下命令:

SELECT scann_index_maintenance('INDEX_NAME');

手动重建索引

如果您想使用创建索引时指定的配置重建索引,可以手动重建索引。

如需手动重建索引,请运行以下命令:

REINDEX INDEX CONCURRENTLY INDEX_NAME;

INDEX_NAME 替换为要重建的索引的名称,例如 my-scann-index。索引名称会在整个数据库中共享。确保每个索引名称对数据库中的每个表中都是唯一的。

如需详细了解如何在 PostgreSQL 中重新编制索引,请参阅 REINDEX

后续步骤