IVF 向量查询排名选项¶
概述¶
在使用 IVF(倒排文件)索引进行向量相似性搜索时,MatrixOne 提供了 BY RANK WITH OPTION 子句来控制查询执行过程中排名函数的应用方式。此功能允许你根据具体使用场景优化查询性能和准确性。
语法¶
SELECT column_list
FROM table_name
ORDER BY distance_function(vector_column, query_vector) ASC
LIMIT k
BY RANK WITH OPTION 'mode = <mode>';
参数¶
参数 |
描述 |
|---|---|
|
控制排名函数的应用时机。有效值: |
模式选项¶
mode = pre(预排名模式)¶
在预排名模式下,IVF 索引用于在应用排名函数之前过滤候选向量。此模式:
行为:首先使用 IVF 索引选择候选质心,然后在这些候选中应用排名
性能:执行速度最快,因为排名仅应用于数据子集
准确性:如果相关结果位于未被探测限制选中的质心中,可能会遗漏
使用场景:高吞吐量场景,查询速度优先于完美召回率。
-- 示例:预排名模式
SELECT id, content, l2_distance(embedding, '[1.0, 2.0, 3.0, 4.0]') AS distance
FROM documents
ORDER BY l2_distance(embedding, '[1.0, 2.0, 3.0, 4.0]') ASC
LIMIT 10
BY RANK WITH OPTION 'mode = pre';
mode = force(强制模式)¶
在强制模式下,系统强制使用 IVF 索引进行排名,无论查询优化器的默认决策如何。此模式:
行为:明确强制使用索引并应用严格的排名策略
性能:针对确定索引使用有益的场景进行了优化
准确性:基于探测限制设置,在速度和准确性之间取得平衡
使用场景:当你知道 IVF 索引非常适合你的查询模式并希望确保使用它时。
-- 示例:强制模式
SELECT id, content, l2_distance(embedding, '[1.0, 2.0, 3.0, 4.0]') AS distance
FROM documents
ORDER BY l2_distance(embedding, '[1.0, 2.0, 3.0, 4.0]') ASC
LIMIT 10
BY RANK WITH OPTION 'mode = force';
mode = post(后排名模式)¶
在后排名模式下,排名函数在 IVF 索引检索出扩展的候选集之后应用。此模式:
行为:从 IVF 索引检索更多候选项,然后使用精确距离计算对它们重新排名
性能:比预排名慢,但比全表扫描快
准确性:更高的准确性,因为最终排名基于精确距离计算
使用场景:需要高召回率且精确排名很重要的场景。
-- 示例:后排名模式
SELECT id, content, l2_distance(embedding, '[1.0, 2.0, 3.0, 4.0]') AS distance
FROM documents
ORDER BY l2_distance(embedding, '[1.0, 2.0, 3.0, 4.0]') ASC
LIMIT 10
BY RANK WITH OPTION 'mode = post';
模式比较¶
模式 |
索引使用 |
排名策略 |
速度 |
准确性 |
适用场景 |
|---|---|---|---|---|---|
|
先使用 IVF 过滤 |
在 IVF 候选中排名 |
⚡ 最快 |
较低 |
高吞吐量、对延迟敏感 |
|
强制使用 IVF 索引 |
严格基于索引排名 |
🚀 快 |
中等 |
可预测的索引使用 |
|
使用 IVF 获取候选 |
用精确距离重新排名 |
🐢 较慢 |
⭐ 最高 |
高召回率需求 |
完整示例¶
设置¶
-- 创建带向量列的表
CREATE TABLE products (
id BIGINT PRIMARY KEY,
name VARCHAR(200),
embedding VECF32(4)
);
-- 插入示例数据
INSERT INTO products VALUES (1, 'Product A', '[0.1, 0.2, 0.3, 0.4]');
INSERT INTO products VALUES (2, 'Product B', '[0.5, 0.6, 0.7, 0.8]');
INSERT INTO products VALUES (3, 'Product C', '[0.2, 0.3, 0.4, 0.5]');
INSERT INTO products VALUES (4, 'Product D', '[0.9, 0.8, 0.7, 0.6]');
INSERT INTO products VALUES (5, 'Product E', '[0.3, 0.4, 0.5, 0.6]');
-- 创建 IVF 索引
CREATE INDEX idx_products_embedding
USING IVFFLAT ON products(embedding)
LISTS=2 OP_TYPE "vector_l2_ops";
-- 设置查询的探测限制
SET @PROBE_LIMIT = 1;
查询示例¶
-- 快速近似搜索(预排名)
SELECT id, name, l2_distance(embedding, '[0.1, 0.2, 0.3, 0.4]') AS distance
FROM products
ORDER BY l2_distance(embedding, '[0.1, 0.2, 0.3, 0.4]') ASC
LIMIT 3
BY RANK WITH OPTION 'mode = pre';
-- 保证使用索引(强制模式)
SELECT id, name, l2_distance(embedding, '[0.1, 0.2, 0.3, 0.4]') AS distance
FROM products
ORDER BY l2_distance(embedding, '[0.1, 0.2, 0.3, 0.4]') ASC
LIMIT 3
BY RANK WITH OPTION 'mode = force';
-- 高准确度搜索(后排名)
SELECT id, name, l2_distance(embedding, '[0.1, 0.2, 0.3, 0.4]') AS distance
FROM products
ORDER BY l2_distance(embedding, '[0.1, 0.2, 0.3, 0.4]') ASC
LIMIT 3
BY RANK WITH OPTION 'mode = post';
最佳实践¶
选择合适的模式¶
实时应用(如边输边搜):使用
mode = pre批量处理且准确性重要:使用
mode = post查询优化器决策不优时:使用
mode = force
结合探测限制使用¶
@PROBE_LIMIT 变量控制扫描多少个质心。将其与排名选项结合使用以获得最佳结果:
-- 高准确度配置
SET @PROBE_LIMIT = 10;
SELECT id, name, l2_distance(embedding, '[0.1, 0.2, 0.3, 0.4]') AS distance
FROM products
ORDER BY l2_distance(embedding, '[0.1, 0.2, 0.3, 0.4]') ASC
LIMIT 5
BY RANK WITH OPTION 'mode = post';
-- 高速度配置
SET @PROBE_LIMIT = 1;
SELECT id, name, l2_distance(embedding, '[0.1, 0.2, 0.3, 0.4]') AS distance
FROM products
ORDER BY l2_distance(embedding, '[0.1, 0.2, 0.3, 0.4]') ASC
LIMIT 5
BY RANK WITH OPTION 'mode = pre';
性能调优¶
大多数用例从
mode = pre开始监控召回率,如果准确性不足则切换到
mode = post当观察到查询优化器未使用索引时,使用
mode = force
限制¶
BY RANK WITH OPTION仅适用于 IVF 索引的向量列目前仅支持
l2_distance度量模式选项必须指定为字符串字面量