创建索引
更新时间: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等多种不同的算法,用户可以根据自己的业务场景进行选择,算法的说明参考:算法介绍。
用户在创建向量索引的时候,可以为每个字段指定需要的索引算法和算法相关的参数,详情请参考以下示例和参数说明:
JSON
1PUT my_index
2{
3 "settings": {
4 "index": {
5 "knn": true,
6 "number_of_shards": 5, // 索引的分片数量,创建后无法修改,建议单个分片存储100万-500万向量,建议单个分片存储容量不超过50GB
7 "number_of_replicas": 1 // 分片的副本数量,取值范围[0, 节点数-1],可随时修改
8 }
9 },
10 "mappings": {
11 "properties": {
12 "id": {
13 "type": "long"
14 },
15 "file-type": {
16 "type": "keyword"
17 },
18 "field_hnsw": {
19 "type": "bpack_vector",
20 "index_type": "hnsw", // 构建hnsw索引
21 "dims": 768, // 设置实际的向量维度
22 "space_type": "l2",
23 "parameters": { // 指定hnsw参数
24 "m": 32,
25 "ef_construction": 256
26 }
27 },
28 "field_hnsw_default": { // 只配置必填参数,其他参数均为默认值
29 "type": "bpack_vector",
30 "index_type": "hnsw", // 构建hnsw索引
31 "dims": 768
32 },
33 "field_linear": { // 只想用linear算法的字段,可以把build_index参数置为false,代表不会实际构建向量索引结构
34 "type": "bpack_vector",
35 "index_type": "hnsw",
36 "dims": 768,
37 "build_index": false // 默认为true
38 },
39 "field_hnsw_sq8": {
40 "type": "bpack_vector",
41 "dims": 768,
42 "index_type": "hnsw_sq8", // 构建hnsw_sq8索引
43 "space_type": "l2",
44 "parameters": { // 指定hnsw参数
45 "ef_construction": 256,
46 "m": 32
47 }
48 },
49 "field_hnsw_pq": {
50 "type": "bpack_vector",
51 "dims": 768,
52 "index_type": "hnsw_pq", // 构建hnsw_pq索引
53 "space_type": "l2",
54 "parameters": { // 指定hnsw_pq参数
55 "ef_construction": 256,
56 "m": 32,
57 "pqm": 128
58 }
59 },
60 "field_ivf": {
61 "type": "bpack_vector",
62 "dims": 768,
63 "index_type": "ivf", // 构建ivf索引
64 "space_type": "l2",
65 "parameters": { // 指定ivf参数
66 "nlist": 100
67 }
68 },
69 "field_ivf_pq": {
70 "type": "bpack_vector",
71 "dims": 768,
72 "index_type": "ivf_pq", // 构建ivf_pq索引
73 "space_type": "l2",
74 "parameters": { // 指定ivf_pq参数
75 "nlist": 100,
76 "pqm": 128
77 }
78 },
79 "field_ivf_hnsw": {
80 "type": "bpack_vector",
81 "dims": 768,
82 "index_type": "ivf_hnsw", // 构建ivf_hnsw索引
83 "space_type": "l2",
84 "parameters": { // 指定ivf_hnsw参数
85 "nlist": 100,
86 "ef_construction": 256,
87 "m": 32
88 }
89 },
90 "field_ivf_hnsw_pq": {
91 "type": "bpack_vector",
92 "dims": 768,
93 "index_type": "ivf_hnsw_pq", // 构建ivf_hnsw_pq索引
94 "space_type": "l2",
95 "parameters": { // 指定ivf_hnsw_pq参数
96 "nlist": 100,
97 "ef_construction": 256,
98 "m": 32,
99 "pqm": 128
100 }
101 }
102 }
103 }
104}
参数
向量字段相关参数
参数 | 类型 | 是否必填 | 默认值 | 创建后是否可修改 | 说明 |
---|---|---|---|---|---|
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开始尝试,再根据业务所需要的召回率来调整测试。 |