You need to enable JavaScript to run this app.
导航
createIndex
最近更新时间:2024.06.04 11:03:55首次发布时间:2024.04.17 14:21:09

概述

createIndex 用于为指定的数据集 Collection 创建索引 Index。
创建索引可以加速向量的相似度搜索,它根据指定的索引算法和数据结构将向量库中的原始数据进行分组排序,提高相似度搜索的效率和准确性,是驱动向量数据库在短时间内筛选出候选的核心所在。
对于索引的数据集只存在稠密向量(即 vector 类型字段)的情况,我们称这种索引为纯稠密索引;对于索引的数据集中存在稠密向量和稀疏向量(vector 和 sparse_vector 类型字段)的情况,我们称这种索引为混合索引。

请求参数

请求参数是 CreateIndexParam,CreateIndexParam 类包括的参数如下表所示。

参数

子参数

类型

是否必选

默认值

参数说明

collectionName

string

指定创建索引所属的 Collection 名称。

  • 只能使用英文字母、数字、下划线_,并以英文字母开头,不能为空。
  • 长度要求:[1, 128]。
  • Collection 名称不能重复。

indexName

string

指定创建的索引 Index 名称。

  • 只能使用英文字母、数字、下划线_,并以英文字母开头,不能为空。
  • 长度要求:[1, 128]。
  • 索引名称不能重复。

vectorIndex

说明

VectorIndexParams实例。

indexType

string

IndexType.HNSW

向量索引类型。取值如下:

  • IndexType.HNSW:全称是 Hierarchical Navigable Small World,一种用于在高维空间中采用 ANN 搜索的数据结构和算法,是基于图的索引。HNSW通过构建多层网络减少搜索过程中需要访问的节点数量,实现快速高效地搜索最近邻,适合对搜索效率要求较高的场景。
  • IndexType.HNSW_HYBRID:支持混合索引的 hnsw 算法。混合索引算法可以同时对数据集中的稠密向量和稀疏向量进行索引,并在检索时返回兼顾两种类型相似性的结果。适用于对搜索效率要求较高,且需要同时检索稀疏和稠密向量的场景。
    HNSW_HYBRID索引的数据集必须包含 sparse_vector类型数据,即定义了sparse_vector类型字段,或绑定了能产生sparse_vector 类型向量的 pipeline。
  • IndexType.FLAT:暴力索引,搜索时遍历整个向量数据库的所有向量与目标向量进行距离计算和比较,查询速度较慢,但是 flat 能提供100%的检索召回率,适用于向量候选集较少,且需要100%检索召回率的场景。
  • IndexType.IVF:倒排索引,利用倒排的思想保存每个聚类中心下的向量,每次查询向量的时候找到最近的几个中心,分别搜索这几个中心下的向量,速度较快,但是精度略低,适合中等规模数据量,对搜索效率要求高,精度次之的场景。
  • IndexType.DISKANN:基于 Vamana 图的磁盘索引算法,将 Vamana 图与 PQ 量化压缩方案结合,构建DiskANN索引。图索引和原始数据存在SSD中,压缩索引放在内存中。检索请求时会将query向量与聚簇中心比较,然后从磁盘读取对应的原始数据进行算分。适用于大规模数据量,性能不是特别敏感,内存成本更低,且召回率较高的场景。

distance

string

DistanceType.IP

距离类型,衡量向量之间距离的算法。取值如下:

  • DistanceType.IP:全称是 Inner Product,内积,该算法基于向量的内积,即两个元素的对应元素相乘并求和的结果计算相似度,内积值越大相似度越高。
  • DistanceType.L2:欧几里得距离,它计算两个向量的欧几里得空间距离,欧式距离越小相似度越高。
  • DistanceType.COSINE:余弦相似度(Cosine Similarity),也称为余弦距离(Cosine Distance),用于计算两个高维向量的夹角余弦值从而衡量向量相似度,夹角余弦值越小表示两向量的夹角越大,则两个向量差异越大。
    当 distance=DistanceType.COSINE 时,默认对向量做归一化处理。

对于hnsw_hybrid索引算法,距离类型选择只对稠密向量生效,稀疏向量仅支持内积。

quant

string

QuantType.Int8

量化方式。量化方式是索引中对向量的压缩方式,可以降低向量间相似性计算的复杂度。基于向量的高维度和大规模特点,采用向量量化可以有效减少向量的存储和计算成本。取值如下:

  • QuantType.Int8:将4字节的 float 压缩为单个字节,以获取内存和计算延迟的收益,会造成微小的损失精度,比如 cosine 距离会出现大于1的分值。
  • QuantType.Float:全精度,未做压缩量化。
  • QuantType.Fix16:将4字节的 float 压缩为两个字节,以获取内存和计算延迟的收益,会造成微小的损失精度。通过损失一定的检索精度,提升检索性能,节约资源成本。
  • QuantType.PQ:将高维向量转换为低维码本向量,以减少内存占用并提高搜索效率。

hnswM

数值

20

hnsw 索引参数,表示邻居节点个数。

  • 当 indexType 配置为 IndexType.HNSW 时可选配置。

hnswCef

数值

400

hnsw 索引参数,表示构建图时搜索邻居节点的广度。

  • 当 indexType 配置为 IndexType.HNSW 时可选配置。

hnswSef

数值

800

hnsw 索引参数,表示线上检索的搜索广度。

  • 当 indexType 配置为 IndexType.HNSW 时可选配置。

cpuQuota

int

2

索引检索消耗的 CPU 配额,格式为正整数。

  • 与吞吐量有关,和延迟无关,1CPU 核约为 100QPS。
  • N个分片数量N倍的 CPU 消耗;如果检索消耗的 CPU 超过配额,该索引会被限流。
  • 取值范围:[2, 10240]。

description

string

”“

索引的自定义描述。

partitionBy

string

“”

partitionBy 用于划分子索引 partition 。根据某个标量字段可以将数据集划分成不同的子数据集,不同的子数据集构建为不同的子索引,实现混合检索时在子索引内检索并减少过滤,从而提升检索性能。

  • partitionBy 对应字段名称 fieldName,支持 field 类型为 int64、list<int64>、string、list<string>。partition 对应 field 的字段值。
  • partitionBy 划分的子索引 partition 数量建议不超过1000个。
  • partitionBy 参数未设置时,则子索引 partition 默认为 “default”。
  • 适用场景:适用于将数据集划分为多个子数据集,在某个子数据集/子索引内部检索等检索模式固定的场景。比如,根据国家ID将数据集拆分,针对某个国家ID的子索引检索场景,无需对国家ID进行过滤,提升检索性能。

scalarIndex

array

None

标量字段列表。

  • scalarIndex 默认为 None,表示所有字段构建到标量索引。
  • scalarIndex 为 [] 时,表示无标量索引。
  • scalarIndex 为非空列表时,表示将列表内字段构建到标量索引。

shard_count

int

分片数。索引分片是指在大规模数据量场景下,可以把索引数据切分成多个小的索引块,分发到同一个集群不同节点进行管理,每个节点负责存储和处理一部分数据,可以将查询负载分散到不同的节点上,并发的进行处理。当一个节点发生故障时,系统可以自动将其上的分片数据迁移到其他的正常节点上,保证稳定性,以实现数据的水平扩展和高性能的读写操作。

  • 取值范围:[1, 256]。
  • 默认为1,分片数预估参考:数据预估数据量/3000万。

示例

请求参数

VectorIndexParams vectorIndex = new VectorIndexParams()
                                        .setDistance(DistanceType.COSINE)
                                        .setIndexType(IndexType.HNSW_HYBRID)
                                        .setQuant(QuantType.Float)
                                        .build();
        List<String> scalarIndex = new ArrayList<>();
        scalarIndex.add("price");
        scalarIndex.add("aim");
        CreateIndexParam createIndexParam = new CreateIndexParam()
                                        .setCollectionName("javaSDKTest")
                                        .setIndexName("test_index")
                                        .setDescription("this is a test for index")
                                        .setCpuQuoat(5)
                                        .setVectorIndex(vectorIndex)
                                        .setScalarIndex(scalarIndex)
                                        .setPartitionBy("like")
                                        .build();
        Index index = vikingDBService.createIndex(createIndexParam);
        System.out.println(index);

返回值

Java 调用执行上面的任务,返回 Index 实例。Index 实例包含的属性如下表所示。

属性

类型

说明

collectionName

string

显示索引所属的 Collection 名称。

indexName

string

显示索引 Index 名称。

description

string

显示索引的描述。

cpuQuota

int

显示索引线上检索消耗的 CPU 配额。如果检索消耗的 CPU 超过配额,该索引会被限流。

partitionBy

string

partitionBy 用于划分子索引 partition,对应字段名称 fieldName。根据某个标量字段可以将数据集划分成不同的子数据集,不同的子数据集构建为不同的子索引,实现混合检索时在子索引内检索并减少过滤,从而提升检索性能。

vectorIndex

VectorIndexParams

向量索引参数。

scalarIndex

ArrayList

标量索引字段列表。

status

String

索引状态。取值如下:

  • init:初始化,可能在构建或加载中。
  • ready:已上线,可以正式提供服务。

shardCount

int

分片数。

createTime

string

索引创建时间。

updateTime

string

索引更新时间。

updatePerson

string

索引更新人。

indexCost

map

  • cpu_core:索引占用 CPU 核数。
  • mem_gb:索引占内存大小。