外观
索引
用向量索引、全文索引、标量索引等手段优化 LanceDB 的检索性能。
适用: Embedded ✅、Enterprise ✅
索引通过按特定查询模式组织数据,来加快检索与过滤。LanceDB 支持三大类索引:
- 向量索引(Vector Index):在高维数据(图像、音频或文本向量)中高效检索相似向量
- 全文检索索引(Full-Text Search Index):通过对词和短语建索引,实现快速的关键词检索
- 标量索引(Scalar Index):加速结构化数值或类别数据的过滤
支持的索引
| 索引 | 适用场景 | 说明 |
|---|---|---|
IVF(向量) | 大规模向量检索,且需要可调的精度/速度取舍。 | 倒排文件索引(Inverted File Index):一种基于分区的近似最近邻算法,把相似向量聚到同一分区以便高效检索。量化方式:None/Flat PQ SQ RQ |
IVF_HNSW(向量) | 大规模向量检索,既要高召回又要高效分区。它把 IVF 的可扩展性与 HNSW 的检索质量结合起来。 | 混合索引:先做 IVF 分区,再在每个分区内建 HNSW 图。检索质量优于纯 IVF,同时保留可扩展性。量化方式:None/Flat SQ PQ |
FTS(全文检索) | 字符串列(标题、描述、正文),需要基于 BM25 排序的关键词检索。 | 使用 BM25 排序算法的全文检索索引。支持可配置的分词、词干还原、停用词移除与针对特定语言的处理。 |
BTree(标量) | 数值、时间与字符串列,取值大多互不相同。最适合选择性较高的相等、不等与范围谓词。 | 有序索引:保存标量列的有序副本,块头信息放在 btree 缓存里。表头条目映射到若干行组成的块(每块 4096 行),以便高效读取磁盘。 |
Bitmap(标量) | 基数较低的列,不同取值只有几千个甚至更少。加速相等与范围过滤。 | 为列中每个不同取值存一张位图,每行一位表示是否命中。对低基数数据非常省内存。 |
LabelList(标量) | 列表列(标签、分类、关键词),需要 array_has_all 或 array_has_any 过滤。 | 面向基本类型 List<T> 与 LargeList<T> 列的标量索引,底层用位图结构,实现快速的数组成员判断。 |
FM(标量) | 需要对原始子串做检索的字符串或二进制列。 | 在 Utf8、LargeUtf8、Binary 或 LargeBinary 数据上建 FM-Index,支持 contains(path, 'needle') 这类过滤。分词式检索与 BM25 排序请改用 FTS。 |
NGram(标量) | 需要用字符三元组做子串检索的字符串列。 | 在 Utf8 与 LargeUtf8 列上建的三元组索引,先把 contains(col, 'needle') 以及部分 LIKE 和正则谓词收窄到共享查询三元组的行,再逐行复核谓词。短于三元组长度的查询用不上它;任意长度子串请用 FM,分词检索请用 FTS。 |
部署形态会构建 IVF_FLAT、IVF_PQ、IVF_RQ 与 IVF_HNSW_SQ 这几种向量索引;IVF_SQ、IVF_HNSW_FLAT 与 IVF_HNSW_PQ 只有嵌入式库才会构建。
量化
LanceDB 还支持多种量化方式,向量索引用它们来压缩向量、降低存储需求:
| 量化方式 | 适用场景 | 说明 |
|---|---|---|
PQ(乘积量化) | 大多数向量检索场景的默认选择。当你需要在索引大小与召回率之间取平衡时用它。 | 把向量切成若干子向量并分别量化,在压缩比与检索精度之间取得不错的平衡。 |
RQ(RabitQ 量化) | 当你需要极限压缩,或对每个维度有特定要求时用它。 | 基于 RabitQ 码本做逐维量化,可以按维度精细控制压缩。使用 IVF_RQ 时,向量维度必须能被 8 整除。 |
SQ(标量量化) | 当你需要更快的建索引速度,或各维度的取值范围比较一致时用它。 | 对每个维度单独量化。比 PQ 简单,但压缩率通常更低。 |
None/Flat | 用于二进制向量(配合 hamming 距离),或当你需要最高召回且有足够存储时。 | 不量化,直接存原始向量。精度最高,但更占存储和内存。 |
性能
向量索引
如果向量检索的延迟随表变大而上升(比如在很小的表上是毫秒级,长到几百万行后变成秒级),先确认查询是不是在没有索引的情况下扫了全量向量。索引从哪个规模开始起作用,取决于向量维度、硬件和你对延迟的要求——请在选索引之前先测自己的负载。按数据形态选型:
| 索引 | 什么时候用 |
|---|---|
IVF_PQ | 通用默认,也是部署形态在设为自动索引某列时会构建的那种。在低维度(≤ 256)下精度高于 RQ。 |
IVF_RQ | 高维向量的极限压缩,构建也比 PQ 快。 |
IVF_HNSW_SQ | 无过滤检索下召回/延迟最优;在选择性较高的过滤条件下延迟波动更大。 |
IVF_FLAT | 二进制向量配 hamming 距离时的必需选项。 |
距离度量在索引建好之后就固定了。请根据向量化模型的训练方式来选:cosine(未归一化)、dot(已归一化,性能最好)、l2(通用,默认)、hamming(二进制)。如果查询显式要求了另一种度量,索引就用不上,查询会回退到暴力扫描;部署形态可以配置成在大表上拒绝这种扫描。参数调优见向量索引。
标量索引
标量索引能减少选择性过滤需要扫描的行数,也能加快 merge_insert 的键查找。先从这些操作里高频出现的列开始索引,然后用查询计划确认索引真的有帮助。按列的取值特点选类型:
| 索引 | 最适合 |
|---|---|
BTREE(默认) | 取值大多互不相同的数值、字符串、时间列 |
BITMAP | 布尔列与低基数列(< 约 1,000 个不同取值) |
LABEL_LIST | 需要用 array_has_any / array_has_all 查询的 List<T> 列 |
详见标量索引。
全文检索
词元位置与保留的停用词会增加全文索引里存放的信息量。做基础关键词检索就保持默认;要做短语查询,再开启 with_position=True 并保留需要的停用词。完整选项见 FTS 索引的配置说明。