过滤的向量搜索包含查询向量和特定字段的过滤条件。 AlloyDB Omni 使用 PostgreSQL 丰富的查询功能,让您可以通过单个 SQL 接口执行向量搜索,并查询结构化数据和非结构化数据。
过滤选项
AlloyDB Omni 查询优化器在确定向量搜索的最有效过滤策略方面发挥着至关重要的作用。
为了估算不同执行计划的费用,查询优化器会分析您的查询,并考虑过滤条件选择性、数据分布和索引可用性等因素。
根据费用估算结果,优化器会从以下过滤策略中选择最佳策略:
预过滤
预过滤是一种查询优化策略,AlloyDB Omni 会使用您的过滤条件来查找符合条件的一小组项,而不是搜索整个数据集。然后,AlloyDB Omni 会对该较小的组运行向量搜索。
例如,如果您要查找类似的蓝色衬衫,AlloyDB Omni 会先查找所有蓝色衬衫,然后在该组中搜索类似项。
此策略可提高性能,因为它会在缩减的数据集上运行计算密集型向量相似度搜索。
后过滤
后过滤是 AlloyDB Omni 在过滤条件无法大幅缩小结果范围时采用的一种策略。AlloyDB Omni 不会先进行过滤,而是先根据向量搜索结果查找类似项的广泛列表。然后,它会根据您的过滤条件检查结果,以生成最终列表。
例如,如果您搜索类似电影,并且过滤条件非常宽泛(例如 genre = drama),AlloyDB Omni 会先查找大量与您的搜索内容相似的电影,然后按流派进行过滤,因为大多数电影可能都是剧情片。
如果您预计会有许多结果与您的过滤条件匹配,此策略会非常高效。
内嵌过滤
内嵌过滤是一种查询优化策略,其中 AlloyDB Omni 会同时使用向量索引和其他二级索引来串联执行向量搜索和过滤条件评估。AlloyDB Omni 会搜索向量索引以查找相似的向量,还会检查每个向量是否符合元数据过滤条件,并利用 B 树、GIN 或 GiST 等索引快速评估这些条件。
例如,如果您搜索类似的鞋子并按 color = black 进行过滤,内嵌过滤意味着 AlloyDB Omni 只会检查已经是黑色的鞋子的相似度。这比先检查所有鞋子的相似度,然后按颜色过滤,或者先按颜色过滤所有鞋子,然后再检查相似度更高效。
当过滤条件能够适度缩小结果范围时,内嵌过滤效果最佳。
了解查询计划
查询计划可全面展示查询执行过程,并在执行策略字段中显示 AlloyDB Omni 为向量扫描操作选择的过滤策略。
内嵌过滤的查询计划
对于内嵌过滤,AlloyDB Omni 使用自定义扫描计划节点(也称为向量扫描),该节点依赖于位图索引扫描计划节点来为过滤子句提供位图。
向量扫描仅针对满足过滤条件的行计算距离。
以下查询演示了如何对按 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' 索引扫描所使用的过滤条件。