向量检索介绍

更新时间:
复制 MD 格式

EMR Serverless StarRocks 支持存储、索引和检索高维向量数据。您可以使用标准 SQL 在一套系统中完成向量近邻检索、结构化数据过滤和 OLAP 分析,无需将数据复制到独立的向量数据库。同时支持内表向量索引和 DLF Paimon 湖表向量检索,适用于语义搜索、推荐、RAG、多媒体相似度检索等场景。

背景信息

文本、图片、音频和视频等非结构化数据不能直接通过传统等值、范围条件表达语义相似性。通常需要先使用 Embedding 模型将对象编码为固定长度的特征向量,再根据向量间的距离或相似度查找语义相近的对象。

EMR Serverless StarRocks 在实时分析能力基础上扩展了两条向量检索路径:

  • 内表向量检索:在 StarRocks 内表的 ARRAY<FLOAT> 列上创建 HNSW 或 IVFPQ 索引。向量索引扩展到存算分离架构,索引文件与 Segment 一一对应并独立存储在共享存储中,由计算节点按需加载和缓存。

  • DLF 湖表向量检索:在 DLF 中创建 Paimon 表并为向量列创建向量索引,然后在 StarRocks 中通过 DLF Catalog 查询该表完成向量检索。查询时优化器将 TopK 和可下推的结构化过滤条件发送到 Paimon 向量 Global Index,在数据湖侧完成候选召回后再读取命中的数据。DLF 索引创建方式请参见构建 Paimon Global Index。

产品优势

  • 检索与分析一体化:向量、业务属性和事实指标可以在同一条 SQL 中参与过滤、关联、聚合和排序,减少多系统间的数据复制与结果拼接。

  • 存算分离架构原生支持:内表向量索引可直接读写远端共享存储,索引文件随 Segment 元数据管理,适合 Serverless 计算资源弹性伸缩。

  • 湖仓原生检索:支持直接查询 DLF Paimon 湖表上的 Global Index,向量数据无需先导入内表,降低数据冗余和链路维护成本。

  • 精度与成本可调:存算分离内表提供 HNSW 和 IVFPQ 两种索引,DLF Paimon 湖表使用 DiskANN 索引。查询时可通过 ann_params 调整召回率、延迟和资源开销。

  • 可用性保障:当内表 Segment 数据量低于建索引阈值、索引文件缺失或不可用时,查询回退为向量距离逐行计算。DLF Paimon 湖表在向量索引不可用时同样回退为逐行距离计算,优先保证结果可返回。

  • 可观测、可验证:可以通过 EXPLAIN 检查向量索引是否命中,并通过 Query Profile 查看索引加载、缓存命中、检索耗时、候选行数和过滤行数等指标。

向量检索简介

名词解释

  • 特征向量(Embedding):向量是一种将实体和应用代数化的一种表示,其将实体间的关系抽象成向量空间中的距离,而距离的远近代表着形似程度。例如:身高、年龄、性别、地域。

  • 向量索引:用于缩小候选范围、避免对全部向量逐行计算距离的索引结构。

  • 向量检索:在特征向量数据集合中进行快速搜索和匹配的方法,常涉及到的问题有KNN和RNN。

  • KNN(K-Nearest Neighbor):返回与查询向量最相近的 K 条记录,在 SQL 中通常表示为按向量距离或相似度排序并指定 LIMIT K。

  • RNN(Radius Nearest Neighbor):返回距离小于阈值或相似度大于阈值的记录。

  • 精确检索:扫描候选数据并逐行计算距离,结果精确,但数据量较大时计算成本较高。

  • 近似检索(ANN/ANNS):利用向量索引快速返回高召回率的近似结果,在性能、召回率和资源开销之间进行平衡。

  • 预过滤(Prefilter):先使用结构化索引筛选候选行,再进行向量召回。DLF Paimon 湖表可将匹配的 Bitmap/BTree Global Index 条件作为向量检索预过滤条件。

  • 后过滤(Postfilter):先进行向量召回,再对召回结果应用结构化过滤条件。不满足索引下推条件的谓词会作为后过滤执行,可能导致最终返回行数少于 LIMIT,或增加扫描开销。

向量概念与实现映射

向量概念

StarRocks 中的实现

说明

特征向量

内表 ARRAY<FLOAT> 列;DLF Paimon 湖表向量列

查询向量必须与索引维度一致。

内表向量索引

USING VECTOR,支持 HNSW、IVFPQ

每张表最多创建一个向量索引。

湖表向量索引

Paimon Global Index,当前支持DiskANN

索引在湖表侧构建,StarRocks 负责识别和查询下推。

精确距离函数

l2_distance、cosine_similarity、inner_product

不依赖向量索引。

近似距离函数

approx_l2_distance、approx_cosine_similarity、approx_inner_product

满足查询形态和索引条件时使用向量索引。

KNN 查询

ORDER BY <近似距离函数> LIMIT K

L2 使用升序,余弦相似度和内积使用降序。

支持的数据源与索引

数据源

索引类型

距离度量

典型特点

StarRocks 内表

HNSW

L2、余弦相似度

低延迟、高召回;索引体积和内存占用相对较高。

StarRocks 内表

IVFPQ

L2、余弦相似度

通过聚类和乘积量化降低索引体积;通常需要精排以提高最终精度。

DLF Paimon 湖表

Lumina(底层基于 DiskANN)

L2、余弦相似度、内积

数据保留在湖表;支持分片并行召回及结构化 Global Index 预过滤。

查询示例

内表 TopK 向量检索

以下示例按 L2 距离从小到大返回最相近的 10 条记录:

SELECT
    id,
    approx_l2_distance(
        embedding,
        CAST('[0.12, 0.34, 0.56, 0.78]' AS ARRAY<FLOAT>)
    ) AS distance
FROM item_embeddings
ORDER BY distance ASC
LIMIT 10;

使用余弦相似度时,值越大表示越相似,因此需要降序排序:

SELECT
    id,
    approx_cosine_similarity(
        embedding,
        CAST('[0.12, 0.34, 0.56, 0.78]' AS ARRAY<FLOAT>)
    ) AS score
FROM item_embeddings
ORDER BY score DESC
LIMIT 10;

DLF Paimon 湖表标量与向量联合检索

以下示例对满足业务条件的数据使用内积进行 TopK 检索。只有过滤列上存在兼容的 Global Index 时,过滤条件才会作为 Prefilter 下推;其他条件仍会在召回后执行 Postfilter。

SELECT
    item_id,
    approx_inner_product(
        embedding,
        [0.12, 0.34, 0.56, 0.78]
    ) AS score
FROM dlf_catalog.multimodal.item_embeddings
WHERE category = 'document'
ORDER BY score DESC
LIMIT 10;

检查索引是否生效

对查询执行 EXPLAIN。内表查询计划中出现 VECTORINDEX: ON 表示命中向量索引;DLF Paimon 湖表需要确认查询计划包含 Global Index 扫描阶段。若未命中,请优先检查距离函数、排序方向、常量查询向量、维度、LIMIT、索引可用状态和过滤条件形态。

使用限制

内表

  • 每张表最多创建一个向量索引。

  • 向量索引列必须为非空 ARRAY<FLOAT>,且表模型必须为 Duplicate Key 或 Primary Key。

  • 索引支持 HNSW、IVFPQ,索引度量支持 l2_distance 和 cosine_similarity。

  • 查询向量必须是可在优化阶段确定的常量浮点数组,维度需要与索引的 dim 一致。

  • 要命中 TopK 向量索引,ORDER BY 仅能包含一个匹配的近似距离表达式,且必须指定 LIMIT。L2 使用升序,余弦相似度使用降序。

  • 向量索引能力受 FE 配置项 enable_experimental_vector 控制。实例如未默认开启,需要由管理员启用。

  • BE 默认在单个 Segment 达到 10000 行后构建向量索引。可以在索引属性中使用 index_build_threshold 调整阈值;低于阈值的 Segment 查询时回退为逐行计算。IVFPQ 的阈值建议不低于 nlist 所需的训练样本数。

DLF Paimon 湖表

  • 湖表需要预先构建向量索引,索引构建方式请参见构建 Paimon Global Index。

  • TopK 索引优化当前仅支持一个排序评分表达式,评分函数必须为 approx_l2_distance、approx_cosine_similarity 或 approx_inner_product,查询向量必须为常量浮点数组。

  • 使用 CAST(string AS ARRAY<FLOAT>) 等表达式可能导致表达式序列化不兼容、维度校验失败或索引未生效。

  • 只有具备兼容 Bitmap/BTree Global Index 的结构化条件才能进入 Prefilter;不满足下推条件的谓词作为 Postfilter 执行,可能影响召回效果或增加扫描开销。

  • 查询参数可通过会话变量 ann_params 覆盖 Lumina 搜索选项,可配置参数请参见 Apache Paimon Vector Index。参数值会影响召回率、延迟和资源使用,建议基于代表性数据集进行评测后再用于生产。