查询同时需要语义召回和关键词匹配时,单独执行向量检索或全文检索只能得到其中一路的候选结果。LANCE_HYBRID_SCORE 融合同一 Lance 外表的向量与全文候选结果,按语义相似度和文本相关性综合排序。混合检索仅在单节点 IMCI 中执行,不支持行式执行和 MPP 并行执行。只需单路检索时,请参见向量检索或全文检索。
适用范围
已满足使用前提与功能限制中的各项要求。
账号已具有外表的
SELECT权限。已创建待查询的外表。
查询节点已启用 IMCI。
使用限制
查询写法
LANCE_HYBRID_SCORE仅用于混合检索查询,要求融合评分作为唯一排序键,按DESC排序,并指定正整数LIMIT,可配合OFFSET。该函数不能当作普通计算函数使用,不支持在任意执行方式中逐行调用。
查询向量、查询文本和向量权重须在规划查询时可确定。
加入普通字段过滤时,过滤条件必须能完整下推到两路检索。
执行方式
混合检索仅在单节点 IMCI 中执行,不支持行式执行和 MPP 并行执行模式。
数据与索引
混合检索需要可用的向量索引,向量检索列无向量索引时不支持混合检索。
外表 VECTOR 列、远端向量列和查询向量的维度必须一致。
查询的距离度量须与远端向量索引一致。
外表列名须与远端列名一致。
_score、_distance和_hybrid_score是混合检索的内部保留列名。远端数据集包含同名物理列时,查询会被拒绝。
资源与错误行为
任一路检索发生错误时,整条语句都会失败。
两路候选的合并在内存中完成,所需内存受两路候选规模影响。
函数语法
LANCE_HYBRID_SCORE 返回向量检索与全文检索(FTS)的融合评分,分数越大表示综合相关性越高。以下为函数语法示意,方括号表示可选参数,可执行查询见后文示例。
LANCE_HYBRID_SCORE(
DISTANCE(vector_column, query_vector, metric),
text_column, query_text[, alpha]
)参数 | 说明 |
| 向量检索条件。 |
| 全文检索的文本列,须与向量列属于同一 Lance 外表。 |
| 全文检索的查询词,例如 |
| 可选的向量评分权重,须为 0~1 之间的有限数值,默认为 0.5。值越大,越偏向向量检索结果。 |
评分原理
执行混合检索时,Lance 分别获取向量与全文候选记录并合并去重。向量距离和 BM25 评分分别按各自候选集的最大值和最小值归一化,得到归一化向量距离和归一化 BM25 评分。对归一化向量距离用 1 减去该值,使距离越小、相似度数值越大,最后按以下公式加权:
融合评分 = alpha × (1 − 归一化向量距离) + (1 − alpha) × 归一化 BM25 评分只出现在一路候选中的记录,另一路贡献为 0。
示例说明
后文示例中的 example_* 均为示例名称,请替换为实际名称。示例假设外表 example_table 包含 example_id、example_group_id、example_text 和 example_embedding 四列:example_text 为文本列,example_embedding 为非空的十维 32 位浮点向量,映射为 VECTOR(10),远端对应列已创建唯一可用的 L2 向量索引。
会话参数
示例通过 SET SESSION 设置会话级参数,仅影响当前连接。use_imci_engine = FORCED 与 imci_plan_use_mpp = OFF 组合使用,使混合检索在单节点 IMCI 中执行。各参数的作用如下:
参数 | 取值 | 作用 | 是否必需 |
|
| 强制使用 IMCI 执行检索 | 必需 |
|
| 关闭 MPP 并行执行 | 必需 |
|
| 允许使用 Lance 向量索引 | 必需 |
|
| 允许执行全文检索 | 必需 |
|
| 允许标量过滤下推到 Lance | 仅带普通字段过滤的查询需要 |
基本检索
执行示例前,先连接已启用 IMCI 的查询节点并选择外表所在数据库。选库在连接时完成,下方代码块不含选库语句。示例先通过 STRING_TO_VECTOR 将向量文本转换为查询向量并赋值给 @query,再以 @query 作为查询向量、'puppy' 作为查询词、向量权重取 0.5 执行混合检索,按融合评分降序返回最多四条记录。
SET SESSION use_imci_engine = FORCED;
SET SESSION imci_plan_use_mpp = OFF;
SET SESSION imci_enable_vector_search = ON;
SET SESSION imci_enable_fts_query = ON;
SET @query = STRING_TO_VECTOR('[0,1,2,3,4,5,6,7,8,9]');
SELECT example_id,
LANCE_HYBRID_SCORE(
DISTANCE(example_embedding, @query, 'EUCLIDEAN'),
example_text, 'puppy', 0.5) AS example_hybrid_score
FROM example_table
ORDER BY example_hybrid_score DESC
LIMIT 4;查询执行后,通过会话状态可确认执行方式:Last_stmt_use_imci 返回 TRUE 表示查询使用了 IMCI,结合 imci_plan_use_mpp = OFF 可确定为单节点执行。
SHOW SESSION STATUS LIKE 'Last_stmt_use_imci';如需确认是否使用混合检索,可分析执行计划,其中的 Lance Scan Mode: Hybrid 表示使用了混合检索。EXPLAIN ANALYZE 会实际执行查询。
EXPLAIN ANALYZE
SELECT example_id,
LANCE_HYBRID_SCORE(
DISTANCE(example_embedding, @query, 'EUCLIDEAN'),
example_text, 'puppy', 0.5) AS example_hybrid_score
FROM example_table
ORDER BY example_hybrid_score DESC
LIMIT 4;组合查询
以下两个示例均包含单节点 IMCI、向量检索、全文检索的会话参数设置和查询向量初始化,可分别在新连接中执行。
带标量过滤的检索
以下示例在 example_group_id=1 的记录中执行两路检索,再按融合评分排序,返回最多三条记录。相比公共会话参数,该示例额外设置 lance_enable_filter_pushdown = ON。
SET SESSION use_imci_engine = FORCED;
SET SESSION imci_plan_use_mpp = OFF;
SET SESSION imci_enable_vector_search = ON;
SET SESSION imci_enable_fts_query = ON;
SET SESSION lance_enable_filter_pushdown = ON;
SET @query = STRING_TO_VECTOR('[0,1,2,3,4,5,6,7,8,9]');
SELECT example_id, example_group_id
FROM example_table
WHERE example_group_id = 1
ORDER BY LANCE_HYBRID_SCORE(
DISTANCE(example_embedding, @query, 'EUCLIDEAN'),
example_text, 'puppy', 0.5) DESC
LIMIT 3;如果过滤条件不能下推,或设置 lance_enable_filter_pushdown = OFF 关闭过滤下推,该查询无法执行混合检索。
分页查询
以下示例通过设置 LIMIT 和 OFFSET 实现混合检索的分页查询,会话参数与公共设置一致。
SET SESSION use_imci_engine = FORCED;
SET SESSION imci_plan_use_mpp = OFF;
SET SESSION imci_enable_vector_search = ON;
SET SESSION imci_enable_fts_query = ON;
SET @query = STRING_TO_VECTOR('[0,1,2,3,4,5,6,7,8,9]');
SELECT example_id
FROM example_table
ORDER BY LANCE_HYBRID_SCORE(
DISTANCE(example_embedding, @query, 'EUCLIDEAN'),
example_text, 'puppy', 0.5) DESC
LIMIT 2 OFFSET 1;该查询在本次融合排序结果中跳过第一条记录,再返回最多两条。LIMIT 和 OFFSET 会影响候选集规模。评分按本次候选集归一化,因此调整分页参数可能改变候选记录、评分和排序。