You need to enable JavaScript to run this app.
导航
使用 DiskANN 向量引擎
最近更新时间:2025.05.06 18:51:04首次发布时间:2025.05.06 18:51:04
我的收藏
有用
有用
无用
无用

背景信息

传统的向量引擎和算法都将索引结构和图放在内存里以加速计算,在几亿-千亿海量多模态数据搜索的场景下,这种方式会占用大量的内存,造成系统稳定性差且成本极高。针对这一情况,火山引擎云搜索服务则利用了 IO 的能力来分担内存的压力,将 DiskANN 算法引入到 OpenSearch 中,实现了性能型和容量型的最优结合,并通过 RabitQ 量化技术进行更高性能、更低成本的迭代,实现更大数据规模下更低成本的向量存储和检索能力。

说明

  • DiskANN 功能已正式发布。
  • RaBitQ + DiskANN 功能目前处于邀测状态。如果您需要了解更多详细信息或申请试用,欢迎提交工单联系我们。

DiskANN 引擎使用(正式发布)

第一步:Mapping 设置

{
  "mappings": {
    "properties": {
      "target_field": {
        "type": "knn_vector",
        "dimension": 128,
        "method": {
          "engine": "diskann",
          "space_type": "l2",
          "name": "diskann",
          "parameters": {
            "L": 30, // 代表构图时search list的大小
            "R": 32, // 每个节点的联通度,值为(0,512],默认32
            "OPQ": 0 // 是否使用OPQ,默认为0
          }
        }
      }
    }
  }
}

space_type 参数说明:

  • L1:是指两个向量的差,一般用来表示高维坐标距离。
  • L2:向量的差的平方求开方,没有方向只有距离,适合只需要距离的场景,一般用来表示高维坐标的正距离。
  • cosinesimil:0~1 的归一化分值, 既有方向又有距离,适合语义搜索场景。
  • innerproduct:非归一化分值, 既有方向又有距离,适合语义搜索场景。
  • hamming:适合位级别的距离,适合基因序列搜索或者推荐的 simhash 向量等。

第二步:索引配置

// 如果把source里面的vector关掉了,我们可以通过开启这个索引级别的配置,让OS能够在Fetch阶段通过DocValues补全Source
index.knn.synthetic_source.enabled

第三步:集群配置

//样例
PUT _cluster/settings
{
  "persistent": {
    "index": {
      "knn": {
        "algo_param": {
          "diskann": {
            "sl": "100",
            "beam_search": "2",
            "cache_nodes_number": "100000",
          }
        }
      }
    }
  }
}


PUT _cluster/settings
{
  "persistent": {
    "index.knn.algo_param.diskann.sl": 350
  }
}

参数说明:

  • index.knn.algo_param.diskann.b:代表 PQ 的估算内存大小,默认为 0.03GB。
  • index.knn.algo_param.diskann.m:代表 V 图的大小,默认为 5GB。
  • index.knn.algo_param.diskann.sl:代表 search list 的大小,默认为 100。
  • index.knn.algo_param.diskann.cache_nodes_number:代表下载图的时候,缓存节点的个数,默认为 0。
  • index.knn.algo_param.diskann.beam_search:代表 DiskANN 查询的时候 BeamSearch 的大小,默认为 1。
  • index.knn.algo_param.diskann.store_strategy:代表 DiskANN 加载的时候是 Disk,Memory,Hybrid,默认为 Disk。
    • Disk 最多降低 95% 内存成本。
    • Hybrid 降低 50~60% 成本,且亚秒级响应。
    • Memory 支持高并发低延时查询。

注意

index.knn.algo_param.diskann.sl 为必填参数,且参数值必须 > knn 的 k 参数。

第四步:缓存管理

//清除缓存
POST _plugins/_knn/clear_cache/{index_pattern}

//缓存预热
GET _plugins/_knn/warmup/{index_pattern}

DiskANN + RaBitQ 引擎使用(邀测)

第一步:Mapping 设置

{
  "mappings": {
    "properties": {
      "target_field": {
        "type": "knn_vector",
        "dimension": 128,
        "method": {
          "engine": "diskann",
          "space_type": "l2",
          "name": "diskann",
          "parameters": {
            "L": 64, // 代表构图时search list的大小
            "R": 32, // 每个节点的联通度,值为(0,512],默认32
            "quant_type": "rabitq", //使用rabitq量化
            "rabitq_centers": 64  //使用rabitq 的中心点个数
          }
        }
      }
    }
  }
}

在火山引擎云搜索服务中,space_type 参数支持的取值如下:

  • l2:向量的差的平方求开方,没有方向只有距离,适合只需要距离的场景,一般用来表示高维坐标的正距离。
  • cosinesimil:0~1 的归一化分值, 既有方向又有距离,适合语义搜索场景。
  • innerproduct:非归一化分值, 既有方向又有距离,适合语义搜索场景。

第二步:索引配置

"settings": {
  "index.knn": "true",
  "number_of_shards": 1, //索引的分片个数,按数据规模进行分片,如果数据规模大可以设置大一点
  "number_of_replicas": 0, //副本个数
  "knn.algo_param.diskann.store_strategy": "MEMORY",//表示把 rabitQ 全部加入内存
  "knn.algo_param.diskann.distance_strategy": "MULTI_BITS",  //表示使用用 bit 量化来计算
  "knn.algo_param.diskann.sl": 200
}

第三步:集群配置

//样例
PUT _cluster/settings
{
  "persistent": {
    "index": {
      "knn": {
        "algo_param": {
          "diskann": {
            "index.knn.algo_param.diskann.store_strategy": "MEMORY"
          }
        }
      }
    }
  }
}


PUT _cluster/settings
{
  "persistent": {
    "index.knn.algo_param.diskann.sl": 200
  }
}

参数说明:

  • index.knn.algo_param.diskann.b:代表 PQ 的估算内存大小,默认为 0.03GB。
  • index.knn.algo_param.diskann.m:代表 V 图的大小,默认为 5GB。
  • index.knn.algo_param.diskann.sl:代表 search list 的大小,默认为 100。
  • index.knn.algo_param.diskann.cache_nodes_number:代表下载图的时候,缓存节点的个数,默认为 0。
  • index.knn.algo_param.diskann.beam_search:代表 DiskANN 查询的时候 BeamSearch 的大小,默认为 1。
  • index.knn.algo_param.diskann.store_strategy:代表 DiskANN 加载的时候是 Disk,Memory,Hybrid,默认为 Disk。
    • Disk 最多降低 95% 内存成本。
    • Hybrid 降低 50~60% 成本,且亚秒级响应。
    • Memory 支持高并发低延时查询。

第四步:缓存管理

//清除缓存
POST _plugins/_knn/clear_cache/{index_pattern}

//缓存预热
GET _plugins/_knn/warmup/{index_pattern}

查询方式

  • knn 精确搜索支持无限 size,但性能稍差。更多详细信息,请参见 Exact k-NN search with a scoring script
  • 高效搜索,性能高, 但是只能取 topk, 一般不超过 1000,少数会到 2000。更多详细信息,请参见 Filtering data
{
    "knn" : {
        "<vector_field>": {
            "vector": [xxx],
            "k": 100,
            "filter": {}  //可选, 进行条件过滤
        }
    }
}