传统的向量引擎和算法都将索引结构和图放在内存里以加速计算,在几亿-千亿海量多模态数据搜索的场景下,这种方式会占用大量的内存,造成系统稳定性差且成本极高。针对这一情况,火山引擎云搜索服务则利用了 IO 的能力来分担内存的压力,将 DiskANN 算法引入到 OpenSearch 中,实现了性能型和容量型的最优结合,并通过 RabitQ 量化技术进行更高性能、更低成本的迭代,实现更大数据规模下更低成本的向量存储和检索能力。
说明
{ "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。
注意
index.knn.algo_param.diskann.sl
为必填参数,且参数值必须 > knn 的 k 参数。
//清除缓存 POST _plugins/_knn/clear_cache/{index_pattern} //缓存预热 GET _plugins/_knn/warmup/{index_pattern}
{ "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。
//清除缓存 POST _plugins/_knn/clear_cache/{index_pattern} //缓存预热 GET _plugins/_knn/warmup/{index_pattern}
{ "knn" : { "<vector_field>": { "vector": [xxx], "k": 100, "filter": {} //可选, 进行条件过滤 } } }