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

本文介绍如何在火山引擎云搜索服务中使用 DiskANN 向量引擎,并通过 RaBitQ 量化技术实现更低成本的向量存储和检索能力。

背景信息

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

说明

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 向量等。

第二步:索引配置

"settings": {
  "index.knn": "true",
  "number_of_shards": 1, //索引的分片个数,按数据规模进行分片,如果数据规模大可以设置大一点
  "number_of_replicas": 0 //副本个数
}

第三步:集群配置

说明

如无特殊要求可不进行集群配置,不影响引擎的正常使用。

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

参数说明:

  • 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}

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
}

第三步:集群配置

注意

store_strategysl 参数支持索引级别和集群级别配置,若同时设置了索引级别和集群级别的配置,则索引级别的配置会覆盖集群级别的配置。因此,若仅需针对某个索引进行配置,则直接在索引配置中设置相关参数即可,无需在集群配置中再次设置。

PUT _cluster/settings
{
  "persistent": {
    "index.knn.algo_param.diskann.store_strategy": "MEMORY",
    "index.knn.algo_param.diskann.distance_strategy": "MULTI_BITS",
    "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": {}  //可选, 进行条件过滤
        }
    }
}