Hierarchical Navigable Small World,分层的可导航小世界。

一种向量查找算法。利用分层跳表方式建立索引,然后在 NSW 中查找向量的方向。

算法目的:向量查找,对于已有数据,建立其向量表示,放入向量空间中。在搜索时,根据query的向量表示,从数据库中提取数据。

前置知识

  • 三角剖分:将一个图网络切分成一个个三角形网络;每个三角形网络最多相交在一个公共边上
  • Delaunay剖分,三角剖分的进一步限制,可以理解为是“美的三角网络“,Delaunay 剖分是一个三角剖分的唯一最优解。
    • 空圆性:任意四点不能共圆
    • 最大化最小角:两个临接三角形构成的四边形,使其交换对角线,每个三角形内部的最小角不再变大。使得当前形状构建的临接形状是唯一的。
  • 跳表
    • 索引结构的链表:构建多个有序链表,高层链表是底层链表的索引,需要查找数据时从高层查起,逐渐向底层搜索

NSW

Navigable Small World,可导航小世界,HNSW 的基本组成部分。

新节点进入时,在附近搜索临近节点,然后建立连接。

搜索:贪心方法,每个节点之间存在直线距离的预估值。根据该预估值寻找下一个到 query 的靠近方向。

数据插入:对每个插入元素,使用 kNN 查找最近元素,然后将欻入的节点和附近的节点相连。

HNSW

分层的 NSW

查找:类似于跳表,将数据分层存储,上层是下层的索引。在每一层根据预估方向找到最近邻节点,然后进入下一层继续查找。

建立:预设好最大节点数 max_elements,根据最大节点数决定当前数据要进入哪一层,然后将数据插入到选定的层中。

搜索的例子