AlloyDB 中的过滤矢量搜索概览

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

过滤后的向量搜索由查询向量和特定字段的过滤条件组成。AlloyDB 使用 PostgreSQL 的丰富查询功能,让您能够通过单个 SQL 界面执行向量搜索并查询结构化和非结构化数据。

过滤选项

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

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

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

预过滤

预过滤是一种查询优化策略,AlloyDB 会使用您的过滤条件查找与您的条件匹配的一小组项,而不是搜索整个数据集。然后,AlloyDB 会对较小的一组进行矢量搜索。

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

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

后期过滤

后期过滤是 AlloyDB 在过滤条件未大幅缩小结果范围时使用的策略。AlloyDB 会先根据您的向量搜索查找一个包含大量类似项的列表,而不是先进行过滤。然后,系统会根据您的过滤条件检查结果,以生成最终列表。

例如,如果您搜索类似的电影,并且使用了非常宽泛的过滤条件(例如 genre = drama),AlloyDB 会先找到与您的搜索内容相似的大量电影,然后按类型对其进行过滤,因为大多数电影都可能是剧情片。

如果您预计有许多结果与您的过滤条件相符,此策略会很高效。

内嵌过滤

内嵌过滤是一种查询优化策略,AlloyDB 会同时使用矢量索引和其他次级索引来并行执行矢量搜索和过滤条件评估。AlloyDB 会搜索向量索引以查找类似的向量,还会利用 B 树、GIN 或 GiST 等索引快速评估这些条件,以检查每个向量是否与您的元数据过滤条件匹配。

例如,如果您搜索类似的鞋子并按 color = black 过滤,内嵌过滤意味着 AlloyDB 只会检查颜色为黑色的鞋子的相似性。与检查所有鞋子的相似度,然后按颜色过滤,或按颜色过滤所有鞋子,然后检查相似度相比,这种方法更高效。

当过滤条件适度缩小结果范围时,内嵌过滤功能非常有用。

了解查询计划

查询计划可全面了解查询执行过程,并在 Execution Strategy 字段中显示 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 表进行操作。内嵌过滤的查询计划示例的 Execution Strategy 字段中显示了 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' 索引扫描使用的过滤条件。

后续步骤