创建索引
更新时间:2024-10-12
用户可以参考本文档,来进行向量索引创建。
创建索引
向量索引在创建的时候,需要指定 settings.index.knn : true
,以开启向量相关的功能。同时,可以在创建索引的时候指定分片数量number_of_shards
和副本数量number_of_replicas
。
- 分片数量在索引创建后无法修改,增加分片数量,可以提高索引的整体容量,建议单个分片存储100万-500万向量,存储容量不超过50GB。分片数量不宜过高,因为对索引的查询需要汇总所有分片上的子查询结果,所以分片数量会增加查询消耗。因此,增加分片数量不会提高查询QPS。
- 副本数量定义了每个分片有多少份数据副本,可以随时修改,取值范围[0, 节点数-1]。提高副本数量,可以扩展查询可用副本,提高整体QPS,不过会增加数据冗余、存储成本、写入和查询时的资源消耗等。目标副本数超过当前节点数时,集群需要扩容。
BES支持hnsw、hnsw_sq8、hnsw_pq、ivf、ivf_qp、ivf_hnsw、ivf_hnsw_pq等多种不同的算法,用户可以根据自己的业务场景进行选择,算法的说明参考:算法介绍。
用户在创建向量索引的时候,可以为每个字段指定需要的索引算法和算法相关的参数,详情请参考以下示例和参数说明:
PUT my_index
{
"settings": {
"index": {
"knn": true,
"number_of_shards": 5, // 索引的分片数量,创建后无法修改,建议单个分片存储100万-500万向量,建议单个分片存储容量不超过50GB
"number_of_replicas": 1 // 分片的副本数量,取值范围[0, 节点数-1],可随时修改
}
},
"mappings": {
"properties": {
"id": {
"type": "long"
},
"file-type": {
"type": "keyword"
},
"field_hnsw": {
"type": "bpack_vector",
"index_type": "hnsw", // 构建hnsw索引
"dims": 768, // 设置实际的向量维度
"space_type": "l2",
"parameters": { // 指定hnsw参数
"m": 32,
"ef_construction": 256
}
},
"field_hnsw_default": { // 只配置必填参数,其他参数均为默认值
"type": "bpack_vector",
"index_type": "hnsw", // 构建hnsw索引
"dims": 768
},
"field_linear": { // 只想用linear算法的字段,可以把build_index参数置为false,代表不会实际构建向量索引结构
"type": "bpack_vector",
"index_type": "hnsw",
"dims": 768,
"build_index": false // 默认为true
},
"field_hnsw_sq8": {
"type": "bpack_vector",
"dims": 768,
"index_type": "hnsw_sq8", // 构建hnsw_sq8索引
"space_type": "l2",
"parameters": { // 指定hnsw参数
"ef_construction": 256,
"m": 32
}
},
"field_hnsw_pq": {
"type": "bpack_vector",
"dims": 768,
"index_type": "hnsw_pq", // 构建hnsw_pq索引
"space_type": "l2",
"parameters": { // 指定hnsw_pq参数
"ef_construction": 256,
"m": 32,
"pqm": 128
}
},
"field_ivf": {
"type": "bpack_vector",
"dims": 768,
"index_type": "ivf", // 构建ivf索引
"space_type": "l2",
"parameters": { // 指定ivf参数
"nlist": 100
}
},
"field_ivf_pq": {
"type": "bpack_vector",
"dims": 768,
"index_type": "ivf_pq", // 构建ivf_pq索引
"space_type": "l2",
"parameters": { // 指定ivf_pq参数
"nlist": 100,
"pqm": 128
}
},
"field_ivf_hnsw": {
"type": "bpack_vector",
"dims": 768,
"index_type": "ivf_hnsw", // 构建ivf_hnsw索引
"space_type": "l2",
"parameters": { // 指定ivf_hnsw参数
"nlist": 100,
"ef_construction": 256,
"m": 32
}
},
"field_ivf_hnsw_pq": {
"type": "bpack_vector",
"dims": 768,
"index_type": "ivf_hnsw_pq", // 构建ivf_hnsw_pq索引
"space_type": "l2",
"parameters": { // 指定ivf_hnsw_pq参数
"nlist": 100,
"ef_construction": 256,
"m": 32,
"pqm": 128
}
}
}
}
}
参数
向量字段相关参数
参数 | 类型 | 是否必填 | 默认值 | 创建后是否可修改 | 说明 |
---|---|---|---|---|---|
type |
string | 是 | bpack_vector | 否 | 字段类型,向量字段类型固定为 bpack_vector |
dims |
int | 是 | 无 | 否 | 向量维数,必填项 |
index_type |
string | 是 | hnsw | 否 | 向量检索算法,必填项,取值参考下方详细说明 |
space_type |
string | 否 | cosine | 否 | 向量检索空间距离算法,取值参考下方详细说明 |
parameters |
object | 否 | null | 否 | 向量检索算法的具体参数,取值参考下方详细说明 |
index_type 参数说明
参数值 | 支持的距离算法(space_type) | 说明 |
---|---|---|
hnsw |
l2,cosinesimil(cosine),innerproduct(dot_prod) | hnsw算法 |
hnsw_sq8 |
l2,cosinesimil(cosine),innerproduct(dot_prod) | hnsw算法+sq8量化 |
hnsw_pq |
l2,cosinesimil(cosine),innerproduct(dot_prod) | hnsw算法+pq量化 |
ivf |
l2,innerproduct(dot_prod) | ivf算法 |
ivf_pq |
l2,innerproduct(dot_prod) | ivf算法+pq量化 |
ivf_hnsw |
l2,innerproduct(dot_prod) | ivf算法+聚簇内构建hnsw索引 |
ivf_hnsw_pq |
l2,innerproduct(dot_prod) | ivf算法+聚簇内构建hnsw索引+pq量化 |
parameters 参数说明
参数 | 类型 | 是否必填 | 默认值 | 创建后是否可修改 | 说明 |
---|---|---|---|---|---|
m |
int | 否 | 16 | 否 | hnsw算法参数。此参数表示构造期间为每个新元素创建的双向链接数,主要影响内存、存储消耗以及召回率。m值越高,意味着更高消耗的内存和存储,更慢的索引构建时间,以及更好的召回率。建议根据min(向量维度 * 1.5, 32)取值,以保证性能,12-48可以满足大多数场景的需求。 |
ef_construction |
int | 否 | 200 | 否 | hnsw算法参数。此参数表示在索引构建过程中,最近邻居的动态扫描区域大小。该值越大,越不容易陷入局部最优解,召回率更高,但是索引构建越慢,取值范围为[2,+∞]。需要注意,如果用户业务需求要求检索top k,那设置的ef_construction值需要大于k。 |
pqm |
int | 否 | 1 | 否 | pq量化算法参数,需要可以被向量维数整除。pq算法的字向量量化器数量,也即子向量数量。一般建议设置为向量维数的1/4;m 取值越小内存占用越小,查询速度越快,精度也更低。 |
nlist |
int | 否 | 4 | 否 | ivf算法参数。向量划分的桶数,较高的值意味着向量数据会被划分到更多的桶,每个桶内到数据更少,查询单个桶的向量数据的资源消耗和时间都会减少,但是查询时相同数量的桶包含的向量数量变少了,召回率可能会下降。查询时需要设置合理的 nprobes 参数以保证召回率。一般建议 nlist = C * sqrt(N),C为用户自选的常数,可以根据具体情况调整,比如可以从C=4开始尝试,再根据业务所需要的召回率来调整测试。 |