Skip to content

索引 ​

用向量索引、全文索引、标量索引等手段优化 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 索引的配置说明。