本页介绍了如何使用存储的嵌入生成索引,以及如何使用 AlloyDB for PostgreSQL 通过 ScaNN
、IVF
、IVFFlat
和 HNSW
索引查询嵌入。如需详细了解如何存储嵌入,请参阅存储向量嵌入。
准备工作
在开始创建索引之前,您必须满足以下前提条件。
安装了由 Google 为 AlloyDB 扩展的基于
pgvector
的vector
扩展版本0.5.0
或更高版本。CREATE EXTENSION IF NOT EXISTS vector;
如需生成
ScaNN
索引,请安装vector
扩展程序以及alloydb_scann
扩展程序。CREATE EXTENSION IF NOT EXISTS alloydb_scann;
创建索引
您可以为数据库中的表创建以下索引类型之一。
创建 ScaNN
索引
AlloyDB alloydb_scann
,由 Google 开发的 PostgreSQL 扩展程序,可实现由 ScaNN 算法提供支持的高效最近邻索引。
ScaNN
索引是一种基于树的量化索引,用于近似最近邻搜索。与 HNSW
相比,它可缩短索引构建时间并减小内存占用空间。此外,与 HNSW
相比,它可根据工作负载提供更快的 QPS。
两级树 ScaNN
索引
如需使用 ScaNN 算法将两级树索引应用于包含存储的向量嵌入的列,请运行以下 DDL 查询:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION )
WITH (num_leaves=NUM_LEAVES_VALUE );
替换以下内容:
INDEX_NAME
:您要创建的索引的名称,例如my-scann-index
。索引名称会在数据库中共享。确保每个索引名称在数据库中对应于每个表的唯一名称。TABLE
:要向其中添加索引的表。EMBEDDING_COLUMN
:用于存储vector
数据的列。DISTANCE_FUNCTION
:要与此索引搭配使用的距离函数。请按以下方式之一操作:L2 距离:
l2
点积:
dot_product
余弦距离:
cosine
NUM_LEAVES_VALUE
:要应用于此索引的分区数量。设置为 1 到 1048576 之间的任意值。如需详细了解如何确定此值,请参阅调整ScaNN
索引。
三级树 ScaNN
索引
如需使用 ScaNN 算法为包含存储的向量嵌入的列创建三级树索引,请运行以下 DDL 查询:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION )
WITH (num_leaves=NUM_LEAVES_VALUE , max_num_levels = MAX_NUM_LEVELS );
替换以下内容:
MAX_NUM_LEVELS
:K 均值聚类树的最大层数。对于基于树的两级量化,请将其设置为1
(默认值);对于基于树的三级量化,请将其设置为2
。
创建索引后,您可以按照使用给定文本执行最近邻查询中的说明,运行利用该索引的最近邻搜索查询。
必须设置索引参数,以便在 QPS 和召回率之间取得适当的平衡。如需详细了解如何调整 ScaNN
索引,请参阅调整 ScaNN
索引。
如需在使用 real[]
数据类型(而非 vector
)的嵌入列上创建此索引,请将该列转换为 vector
数据类型:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS )) DISTANCE_FUNCTION )
WITH (num_leaves=NUM_LEAVES_VALUE , max_num_levels = MAX_NUM_LEVELS );
将 DIMENSIONS
替换为嵌入列的维度宽度。如需详细了解如何查找维度,请参阅矢量函数中的 vector_dims
函数。
如需查看索引编制进度,请使用 pg_stat_progress_create_index
视图:
SELECT * FROM pg_stat_progress_create_index;
phase
列会显示索引创建的当前状态,索引创建后,building index: tree training
阶段会消失。
如需针对目标召回率和 QPS 平衡调整索引,请参阅调整 ScaNN
索引。