常见问题
同一个向量类型字段上能否创建多个向量索引
是的,VexDB 支持这种用法。允许在表的同一个字段上同时创建多种索引,查询优化器会根据各索引估计代价大小选择最终使用的索引。
目前无优势场景,暂不建议这样使用。
向量查询不走索引
向量查询走向量索引的前提条件:
- 使用ORDER BY进行升序排序,且第一个排序条件必须是向量距离计算,距离越小表示越相似。查询使用的距离计算操作符必须与创建索引时指定的操作符一致,对应关系如下:
- <-> floatvector_l2_ops
- <=> floatvector_cosine_ops
- <#> floatvector_ip_ops
- 使用LIMIT对查询结果做top-k限制,否则无法选择向量索引。使用Hint可以强制走索引,但只会返回部分数据。
向标联合索引:
- HybridANN 索引支持纯向量查询,使用限制条件同上。
- HybridANN索引支持纯标量查询,排除第一个向量列后,使用条件和B+树索引相同,但不支持IndexOnlyScan算子。
- HybridANN进行向标联合检索时,会将支持范围内的标量放入检索范围内,向量支持同纯向量查询,标量支持同纯标量查询。
除了上述条件外,是否选择索引以及选择哪些支持范围内的条件组合由代价估计决定。
影响 IVF-PQ 查询召回率的因素
IVF-PQ 子查询受外层 limit 影响,可能导致查询召回率下降:在包含子查询的情况下,如果子查询和外层查询的排序字段不一致,并且外层查询包含 LIMIT 子句,可能会导致查询结果的精确度降低。
WITH tmp AS (
SELECT v AS vec from test1
)
SELECT id
FROM items where id not in (select id from items where id>1000 order by id)
ORDER BY embedding <=> (SELECT vec FROM tmp)
LIMIT 5;
例如, 在上述语句中,内层子查询的排序字段为 id,外层排序字段是向量字段且携带了 limit 语句,此时可能会触发 ivf-pq 的 limit 下推逻辑而导致查询召回率下降。
索引返回元组数可能少于走全表扫描的数据或者 Limit 子句指定的数量
原因:由于 IVFFlat、IVF-PQ 和 HNSW 索引底层算法都是近似搜索算法,查询返回的结果数量会受到不同参数的影响。
对于 IVFFlat 和 IVF-PQ 索引,当 ivf_nlist 值较大而 ivf_probes 值较小时,索引会在较小的数据范围内进行搜索,这可能导致返回结果数量减少。
向量标量混合查询,走索引查询返回的结果可能少于走全表扫描的结果
原因:在混合查询(包含向量条件和标量条件)中,需要协调向量相似度检索与标量条件过滤的顺序。通常,查询会先基于向量条件进行相似度检索,得到的近似结果再经过标量条件过滤。这种处理顺序可能导致部分符合标量条件的记录因不在初步的向量相似度结果集中而被过滤掉,从而进一步减少最终的返回条数。因此,经过双重过滤后,最终返回的结果条数可能会少于预期的数量。