速查
| 索引 | 训练 | 关键参数 | 时间复杂度 | 内存压缩 | 召回率 | 首选用途 |
|---|---|---|---|---|---|---|
| IndexFlat | 无 | — | O(Nd) | 1× | 100% | 小数据基准 |
| IndexIVF | 有 | nlist/nprobe | O(nprobe·Nd/nlist) | 1× | 高 | 中规模精确 |
| IndexPQ | 有 | m/bits | 同上 + 解码 | 32×+ | 中高 | 内存极限 |
| IndexHNSW | 无 | M/efC/efS | ≈O(log N) | 1× | 高 | 高召回在线 |
| IndexLSH | 无 | n_bits | O(N) 但桶内极少 | 1× | 低 | 低维极速筛 |
IndexFlat
- IndexFlat 系列是 Faiss 中最基础的索引类型,其核心是'精准检索',即遍历数据库中所有向量,计算查询向量与每个数据库向量之间的距离,最终返回距离最近的 Top-K 结果。因此也被称为'暴力检索'索引。
- 根据距离度量方式,IndexFlat 的三种类型:
- IndexFlat2: 基于 L2(欧式距离)度量。欧式距离计算为两个向量对应维度差值的平方和的平方根。适用于衡量向量空间中需要物理距离的场景。
- IndexFlatIP: 基于内积度量。内积为两个向量对应维度的乘积和。在 Faiss 中,内积被用作相似而非距离。IndexFlatIP 返回的是内积最大的向量。
- IndexFlatCOSINE: 基于余弦相似度度量。Faiss 中余弦相似度实现:1)对所有向量进行 L2 归一化;2)使用内积计算相似度;3)使用负相似度作为距离,以满足按升序排序的检索逻辑。
运行效果
- 精准检索的性能瓶颈
- 时间瓶颈:O(N) 的线性检索复杂度;
- 内存瓶颈:无压缩的向量存储,IndexFlat 存储原始 float32 向量,不做压缩。float32 每元素占 4 字节,128 维向量占 128x4=512 字节。
实战:SIFT10k 数据集精确检索对比
运行结论
- 不同索引检索速度差异不大。'选择索引类型'不是为了速度,而是为了'度量方式'。
- 不同距离度量会导致截然不同的检索结果。
- L2 vs IP: 10% 重合度,几乎完全不同
- IP vs COS: 20% 重合度,差别依然巨大。
- L2 vs COS: 60% 重合度,部分一致,差别仍然明显。
- 造成不同距离度量衡量是完全不同的'相似性'的原因:
- L2: 空间位置更近
- IP: 模长大 + 方向一致。方向比较一致的向量,空间位置也常常比较接近。L2 和 COS 有较高重合度。
- COS: 方向一致(不考虑模长)。IP 受模长影响,COS 不受模长影响(已归一化)。
总结:


