维护向量索引

选择文档版本:

为确保向量索引能够适应可能影响搜索结果准确率的变化,请维护向量索引。

准备工作

在管理索引维护之前,请安装或更新 vectoralloydb_scann 扩展程序:

  • 如果未安装 vectoralloydb_scann 扩展程序,请安装它们。

    CREATE EXTENSION IF NOT EXISTS vector;
    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    
  • 如果 vectoralloydb_scann 扩展程序已安装,请更新它们。

    ALTER EXTENSION vector UPDATE;
    ALTER EXTENSION alloydb_scann UPDATE;
    

自动维护索引

您可以让 AlloyDB Omni 自动管理向量索引。随着数据集的增长,AlloyDB Omni 会分析并更新质心,并拆分大型离群值分区。这会自动提高每秒查询次数 (QPS) 和搜索结果质量。任何自动更新都是永久性的,直到下一次维护运行。

AlloyDB Omni 默认会为自动调优的 ScaNN 索引启用自动索引维护功能。如果您想创建自动调优的 ScaNN 索引,但停用自动维护功能,请参阅为自动索引停用自动维护功能

如需为手动创建的索引启用自动维护,请参阅在创建索引期间启用自动维护

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

如需在创建索引期间启用自动维护,请将 auto_maintenance 参数设置为 on。例如,请参阅以下用于创建 ScaNN 向量索引的命令。

CREATE INDEX INDEX_NAME ON TABLE_NAME \
USING scann (EMBEDDING_COLUMN_NAME DISTANCE_FUNCTION_NAME) \
WITH (mode='INDEX_MODE', num_leaves=NUM_PARTITIONS, auto_maintenance=on);

执行以下变量替换操作:

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

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

  • EMBEDDING_COLUMN_NAME:用于存储要编入索引的 vector 数据的列。

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

    • L2 距离:l2

    • 点积:dot_product

    • 余弦距离:cosine

  • INDEX_MODE:用于创建 ScaNN 索引的模式。可用的值如下:

    • AUTO:AlloyDB Omni 会自动管理和调整索引的结构。当 mode 设置为 AUTO 时,默认 auto_maintenance 值为 on

    • MANUAL:手动管理和调优 ScaNN 索引。当 mode 设置为 MANUAL 时,默认 auto_maintenance 值为 off

    如需详细了解应使用哪种索引模式,请参阅创建 ScaNN 索引

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

为现有索引配置自动维护

如需为现有的手动索引配置自动维护,请运行以下命令:

ALTER INDEX INDEX_NAME SET (auto_maintenance = AUTOMATIC_MAINTENANCE);

执行以下变量替换操作:

  • INDEX_NAME:要更改的索引的名称。例如 my_scann_index

  • AUTOMATIC_MAINTENANCE:启用或停用自动维护。如需启用,请将值设置为 on。 如需停用,请将值设置为 off

提高自动维护吞吐量

如需提高自动维护吞吐量,请配置 scann.max_background_workers 数据库标志。增加后台工作器的数量可以增加单位时间内处理的索引数量。但不会缩短单个索引的处理时间。此值必须小于为数据库集群设置的 max_worker_processes 值。

如需详细了解如何配置数据库标志,请参阅配置数据库参数

延长自动维护延迟时间

如需增加自动维护运行之间的延迟,请配置 scann.maintenance_background_naptime_s 数据库标志。

如需详细了解如何配置数据库标志,请参阅配置数据库参数

搜索分区百分比

随着 AlloyDB Omni 自动拆分大型离群分区导致分区数量增加,我们建议您调整要搜索的叶数量,以保持最佳性能。如需自动管理此数量,请配置 scann.pct_leaves_to_search 参数。

scann.pct_leaves_to_search 表示要搜索的当前分区的百分比。您可以将此参数设置为介于 0100 之间的任何值。默认值为 0,这会停用此参数,并改为使用 scann.num_leaves_to_search 中设置的值。如果 scann.num_leaves_to_search 也设置为 0,则 AlloyDB Omni 默认使用 1% 个叶。

如果您预计数据集会大幅增长,请将初始值设置为 1

如需设置 scann.pct_leaves_to_search,请运行以下命令:

ALTER DATABASE DB_NAME SET scann.pct_leaves_to_search = PERCENTAGE_PARTITIONS_TO_SEARCH;

执行以下变量替换操作:

  • DB_NAME:数据库的名称。
  • PERCENTAGE_PARTITIONS_TO_SEARCH:要搜索的分区所占的百分比。

手动调用索引维护

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

SELECT scann_index_maintenance('INDEX_NAME');

INDEX_NAME 替换为您要对其调用维护的索引的名称。例如 my_scann_index

为自动索引停用自动维护

如需为自动调优的 ScaNN 索引停用自动维护功能,请在创建索引期间将 auto_maintenance 参数设置为 OFF。例如,请参阅以下命令,该命令会创建一个自动调优的 ScaNN 索引:

CREATE INDEX similarity_index ON products
       USING scann (description_embedding cosine)
WITH (MODE = 'AUTOMATIC', auto_maintenance = 'OFF');

如果您想在现有的自动调优 ScaNN 索引上停用自动维护功能,请参阅为现有索引配置自动维护功能

手动重建索引

如果您的表容易频繁更新或插入,我们建议您定期重建 ScaNN 索引,以提高其召回率准确率。如需详细了解如何查看自构建索引以来向量分布或变更的变化,请参阅查看向量索引指标

如需使用原始配置手动重建索引,请运行以下命令:

REINDEX INDEX CONCURRENTLY INDEX_NAME;

INDEX_NAME 替换为要重建的索引的名称。例如 my_scann_index

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

后续步骤