AlloyDB 中的过滤式向量搜索概览

本页面简要介绍了 AlloyDB for PostgreSQL 中的过滤式向量搜索。

“过滤式向量搜索”包含查询向量以及特定字段的过滤条件。AlloyDB 使用 PostgreSQL 丰富的查询功能,让您可以通过单个 SQL 接口执行向量搜索,同时查询结构化数据和非结构化数据。

过滤选项

AlloyDB 查询优化器在确定向量搜索的最有效过滤策略方面发挥着至关重要的作用。

为了估算不同执行计划的费用,查询优化器会分析您的查询,并考虑过滤条件严苛程度、数据分布和索引可用性等因素。

根据费用估算结果,优化器会从以下过滤策略中选择最佳策略:

预过滤

如果采用预过滤这种查询优化策略,AlloyDB 会使用您的过滤条件来查找符合条件的匹配项子集,而不是搜索整个数据集。之后,AlloyDB 会对该匹配项子集运行向量搜索。

例如,如果您要查找类似的蓝色衬衫,AlloyDB 会先找到所有蓝色衬衫,然后在该子集中搜索类似项。

此策略可提高性能,因为它是在缩减的数据集上运行计算密集型向量相似性搜索。

后过滤

后过滤是 AlloyDB 在您的过滤条件无法大幅缩小结果范围时采用的一种策略。AlloyDB 不会预先过滤,而是先通过您的向量搜索结果得到一个宽泛性的类似项列表。之后,它会根据您的过滤条件检查结果,再生成最终列表。

例如,如果您搜索类似电影,并且提供了一个非常宽泛的过滤条件(例如 genre = drama),AlloyDB 会先找到大量与您的搜索内容类似的电影,然后再按类型过滤这些电影,因为大多数电影可能都是剧情片。

如果您预计会有许多结果与您的过滤条件匹配,此策略会非常高效。

内嵌过滤

如果采用内嵌过滤这种查询优化策略,AlloyDB 会同时使用向量索引和其他二级索引,在执行向量搜索的同时对过滤条件进行评估。AlloyDB 不仅会搜索向量索引来查找相似向量,还会检查每个向量是否符合元数据过滤条件,并利用 B 树、GIN 或 GiST 等索引快速评估这些条件。

例如,如果您搜索类似鞋子并按 color = black 进行过滤,则采用内嵌过滤意味着 AlloyDB 只会检查已经是黑色的鞋子的相似性。相比先检查所有鞋子的相似性,然后再按颜色过滤,或者先按颜色过滤所有鞋子,然后再检查相似性,这种策略更为高效。

当过滤条件能够适度缩小结果范围时,内嵌过滤效果最佳。

了解查询计划

查询计划可全面展示查询执行过程,并在执行策略字段中显示 AlloyDB 为向量扫描操作选择的过滤策略。

内嵌过滤的查询计划

对于内嵌过滤,AlloyDB 会使用自定义扫描计划节点(也称为向量扫描),该节点依赖于位图索引扫描计划节点来为过滤条件子句提供位图。

向量扫描仅针对满足过滤条件的行计算距离。

以下查询演示了如何对按 color = black 过滤的 shoes 搜索进行内嵌过滤

EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;

以下示例查询计划展示了一个采用内嵌过滤进行优化的向量搜索:

Limit (actual rows=10)
  ->  Custom Scan (vector scan) on products
      Execution Strategy: Bitmap assisted vector Scan on products_embedding_index
      Order By: (embedding <=> '[...]')::vector)
      Limit: 10
      ->  Bitmap Index Scan on products (color_index)
          Index Cond: (color = 'black')

在该示例查询计划中,Limit (actual rows=10) 表示查询使用了 SQL 子句 LIMIT 10; 来限制输出内容。actual rows=10 表示相应节点在查询执行期间返回了 10 行数据。

-> Custom Scan (vector scan) on products 节点表示向量搜索操作。这是一种自定义扫描,因为它是针对向量数据的特殊扫描,且在 products 表上运行。内嵌过滤的示例查询计划在执行策略字段中显示 Bitmap assisted vector Scan on products_embedding_index,这表示向量扫描使用位图创建了一个候选行列表,需要在这些行上执行相似性搜索。位图索引扫描用于根据 color = 'black' 条件过滤数据。

Order By: (embedding <=> '[...]')::vector 属性表示结果按向量相似性排序,该相似性使用表达式 (embedding <=> '[...]')::vector 计算得出,其中 embedding 是指向量列,<=> 表示最近邻运算符,[...] 是查询向量,而 ::vector 则用于将数据类型转换为向量数据类型。

-> Bitmap Index Scan on products (color_index) 节点表示对 colors_index 进行的位图索引扫描。位图索引扫描使用位图选择与过滤条件匹配的行,并使用 color_index 进行过滤。

Index Cond: (color = 'black') 属性指定查询的 WHERE 子句中 color = 'black' 索引扫描所使用的过滤条件。

后续步骤