全部产品
Search
文档中心

云原生数据库 PolarDB:向量与全文混合检索

更新时间:Nov 04, 2026

查询同时需要语义召回和关键词匹配时,单独执行向量检索或全文检索只能得到其中一路的候选结果。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]
)

参数

说明

DISTANCE(...)

向量检索条件。vector_column 指定向量列,query_vector 指定查询向量,metric 指定距离度量。

text_column

全文检索的文本列,须与向量列属于同一 Lance 外表。

query_text

全文检索的查询词,例如 'puppy'。

alpha

可选的向量评分权重,须为 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 中执行。各参数的作用如下:

参数

取值

作用

是否必需

use_imci_engine

FORCED

强制使用 IMCI 执行检索

必需

imci_plan_use_mpp

OFF

关闭 MPP 并行执行

必需

imci_enable_vector_search

ON

允许使用 Lance 向量索引

必需

imci_enable_fts_query

ON

允许执行全文检索

必需

lance_enable_filter_pushdown

ON

允许标量过滤下推到 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 会影响候选集规模。评分按本次候选集归一化,因此调整分页参数可能改变候选记录、评分和排序。