HNSW 索引
Written: 2026.061. 为什么需要这讲
本项目的 Milvus 使用 HNSW(Hierarchical Navigable Small World)索引来加速向量检索。主讲义第2讲提到”本项目使用默认的 HNSW 索引”,但没有解释 HNSW 是什么、为什么快、有什么代价。这讲补充这些内容。2. 问题:暴力搜索为什么慢
假设你有一批高维向量,用户输入一个查询向量,要找最相似的 Top-K。3. ANN 的核心思想:搜索前先建索引
- 精度 100% = 暴力搜索
- ANN = 用近似召回换查询加速
- 索引越激进,越可能更快,但越需要用评测集确认召回损失
4. HNSW 的三个核心概念
HNSW = Hierarchical(分层)+ Navigable(可导航)+ Small World(小世界图)4.1 Small World Graph(小世界图)
小世界图是一种特殊的图结构,具有”六度分隔”特性:图中任意两个节点之间的路径都很短。4.2 Navigable(可导航)
“可导航”意味着搜索算法可以贪心地沿着图移动:4.3 Hierarchical(分层)
HNSW 的最大创新。单层图的搜索复杂度是 O(log N),但当图很大时,搜索路径仍然较长。HNSW 通过分层来解决:- 高层:快速定位到目标城市(大步长,少节点)
- 低层:精确导航到目标地址(小步长,多节点)
5. HNSW 的三个关键参数
| 参数 | 含义 | 效果 |
|---|---|---|
M | 每个节点最多有多少邻居 | M↑ → 精度↑、索引大小↑、构建时间↑ |
efConstruction | 构建索引时的搜索深度 | ↑ → 索引质量↑、构建时间↑ |
ef | 查询时的搜索深度 | ↑ → 召回率↑、查询速度↓ |
M=16、efConstruction=200、ef=64 当成不可变标准;如果要确认当前环境的真实参数,应查看 collection 的 index 描述或实际创建日志。
6. HNSW vs 其他索引
| 索引类型 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| FLAT | 暴力搜索 | 100% 精度 | O(N×D) 时间 |
| IVF_FLAT | K-means 聚类 + 只搜最近聚类 | 速度快 | 聚类边界可能漏掉 |
| HNSW | 分层可导航小世界图 | 速度快 + 精度高 | 内存占用较大 |
| DiskANN | 基于磁盘的图索引 | 内存占用小 | 需要 SSD |
7. 在本项目中的体现
本项目的MilvusHybridStore 通过 LangChain 封装创建 Milvus collection,索引参数走当前依赖版本的默认行为。对于当前项目规模,先使用默认参数可以降低复杂度;当数据量、QPS、过滤条件或召回目标变化时,再通过 index 描述、压测和召回评测决定是否调参。
8. 小结
- HNSW = 分层 + 贪心导航 + 小世界图,快速找到近似最近邻
- 分层是核心创新:高层大步长定位,低层小步长精确
- M/ef/efConstruction 控制精度和速度的权衡
- 本项目先使用默认参数;是否“最优”必须由压测和召回评测证明

