You need to enable JavaScript to run this app.
文档中心
云搜索服务

云搜索服务

复制全文
下载 pdf
向量检索
使用 DiskANN 向量引擎
复制全文
下载 pdf
使用 DiskANN 向量引擎
本文介绍如何在火山引擎云搜索服务中使用 DiskANN 向量引擎,并通过 RaBitQ 量化技术实现更低成本的向量存储和检索能力。​
背景信息​
传统的向量引擎和算法都将索引结构和图放在内存里以加速计算,在几亿至千亿的海量多模态数据搜索的场景下,这种方式会占用大量的内存,造成系统稳定性差且成本极高。针对这一情况,火山引擎云搜索服务则利用了 IO 的能力来分担内存的压力,将 DiskANN 算法引入到 OpenSearch 中,实现了性能型和容量型的最优结合,并通过 RaBitQ 量化技术进行更高性能、更低成本的迭代,实现更大数据规模下更低成本的向量存储和检索能力。​
说明​
  • DiskANN + RaBitQ 功能和 DiskANN 功能均已正式发布。​
DiskANN + RaBitQ 引擎使用​
第一步:Mapping 设置​
​
{​
"mappings": {​
"properties": {​
"target_field": {​
"type": "knn_vector",​
"dimension": 128,​
"method": {​
"engine": "diskann",​
"space_type": "cosinesimil",​
"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_strategy 和 sl 参数支持索引级别和集群级别配置,若同时设置了索引级别和集群级别的配置,则索引级别的配置会覆盖集群级别的配置。因此,若仅需针对某个索引进行配置,则直接在索引配置中设置相关参数即可,无需在集群配置中再次设置。​
​
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.03 GB。​
  • index.knn.algo_param.diskann.m:代表 V 图的大小,默认为 5 GB。​
  • 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 引擎使用​
第一步:Mapping 设置​
​
{​
"mappings": {​
"properties": {​
"target_field": {​
"type": "knn_vector",​
"dimension": 128,​
"method": {​
"engine": "diskann",​
"space_type": "cosinesimil",​
"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.03 GB。​
  • index.knn.algo_param.diskann.m:代表 V 图的大小,默认为 5 GB。​
  • 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}​
​
查询方式​
  • 高效搜索,性能高,但是只能取 topk,一般不超过 1000,少数会到 2000。更多详细信息,请参见 Filtering data。​
​
{​
"knn" : {​
"<vector_field>": {​
"vector": [xxx],​
"k": 100,​
"filter": {} //可选, 进行条件过滤​
}​
}​
}​
​
​
最近更新时间:2026.03.03 17:07:08
这个页面对您有帮助吗?
有用
有用
无用
无用