维护向量索引

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

查看向量索引指标

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

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

自动维护索引

在创建 ScaNN 索引时,您可以使用 scann.enable_index_maintenance 全局统一配置 (GUC) 数据库标志以及索引级 auto_maintenance 参数。将这些设置结合使用后,AlloyDB 可以随着数据集的增长逐步管理索引并拆分大型离群值分区。通过拆分分区,AlloyDB 会尝试提供更好的每秒查询次数 (QPS) 和搜索结果。

自动维护索引更新会持续到 AlloyDB 再次更新索引。

如需让 AlloyDB 自动维护索引,请将 alloydb_scann 扩展程序添加到 shared_preload_libraries 参数中,启用 scann.enable_index_maintenance 数据库标志,然后通过重启数据库来加载 alloydb_scann 扩展程序:

  1. alloydb_scann 扩展程序加载到 shared_preload_libraries 列表中:

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,alloydb_scann'|" DATA_DIR/postgresql.conf
  2. 验证参数的配置是否设置正确:

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. 通过在 postgresql.conf 文件中设置 scann.enable_index_maintenance 标志来启用该标志:

    scann.enable_index_maintenance = ON
  4. 重启 AlloyDB Omni 以使参数更改生效:

    Docker

     docker container restart CONTAINER_NAME

    CONTAINER_NAME 替换为您在启动 AlloyDB Omni 容器时为其分配的名称。

    Podman

     podman container restart CONTAINER_NAME

    CONTAINER_NAME 替换为您在启动 AlloyDB Omni 容器时为其分配的名称。

启用 scann.enable_index_maintenance 标志后,您可以为索引启用自动维护,也可以启用 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

后续步骤