简介
本文档介绍如何使用对象存储 COS 的 Go SDK 从向量索引中删除一个或多个向量。
功能说明
DeleteVectors 方法用于从指定的向量索引中,根据向量主键(Key)列表删除对应的向量数据。注意:
单次请求最多可删除500个向量。
删除一个不存在的向量 Key 将正常返回成功,不会报错。
此删除操作不可逆,请谨慎操作。
方法原型
func (s *VectorService) DeleteVectors(ctx context.Context, opt *DeleteVectorsOptions, keys []string) (*Response, error)
请求参数说明
DeleteVectorsOptions 结构体字段说明:参数 | 描述 | 类型 | 是否必填 |
VectorBucketName | 向量桶名称,格式为 <BucketName-APPID>,例如 examplebucket-1250000000。支持小写字母、数字和 -,长度限制为3-63个字符。 | string | 是 |
IndexName | 向量索引名称。 | string | 是 |
keys 参数说明:参数 | 描述 | 类型 | 是否必填 |
keys | 要删除的向量 Key 列表,最大500个。 | []string | 是 |
返回结果说明
调用成功后,将返回
(*Response, error) 两个值。本方法无特殊的业务返回字段,当 error == nil 时表示删除成功。返回值 | 描述 | 类型 |
resp | 响应头信息,包含 HTTP 响应的详细对象等。 | *cos.Response |
err | 错误信息。如果请求成功,返回 nil。 | error |
如果请求失败,将返回非
nil 的 error。向量检索相关的业务错误(如资源不存在等)会封装为 *cos.VectorErrorResponse 结构,您可以通过 cos.IsVectorError() 辅助函数判断并获取详细错误信息。详细的错误处理方式、VectorErrorResponse 结构体说明及服务端错误码列表请参见 异常处理 文档。使用案例
案例一:删除指定向量
package mainimport ("context""fmt""net/http""os"cos "github.com/tencentyun/cos-go-sdk-v5")func main() {vectorURL, _ := cos.NewVectorURL("ap-guangzhou", true)client := cos.NewClient(&cos.BaseURL{VectorURL: vectorURL}, &http.Client{Transport: &cos.AuthorizationTransport{SecretID: os.Getenv("COS_VECTORS_SECRET_ID"),SecretKey: os.Getenv("COS_VECTORS_SECRET_KEY"),},})bucketName := "examplebucket-1250000000"indexName := "my-index"opt := &cos.DeleteVectorsOptions{VectorBucketName: bucketName,IndexName: indexName,}// 指定要删除的向量 Key 列表keys := []string{"vector-001", "vector-002"}_, err := client.Vector.DeleteVectors(context.Background(), opt, keys)if err != nil {if vecErr, ok := cos.IsVectorError(err); ok {fmt.Printf("向量服务错误,错误码: %s, 错误信息: %s, 请求ID: %s\\n",vecErr.Code, vecErr.Message, vecErr.RequestID)} else {fmt.Printf("请求失败: %v\\n", err)}return}fmt.Printf("成功删除 %d 条向量\\n", len(keys))}
案例二:批量删除大量向量(分批处理)
package mainimport ("context""fmt""net/http""os"cos "github.com/tencentyun/cos-go-sdk-v5")func main() {vectorURL, _ := cos.NewVectorURL("ap-guangzhou", true)client := cos.NewClient(&cos.BaseURL{VectorURL: vectorURL}, &http.Client{Transport: &cos.AuthorizationTransport{SecretID: os.Getenv("COS_VECTORS_SECRET_ID"),SecretKey: os.Getenv("COS_VECTORS_SECRET_KEY"),},})bucketName := "examplebucket-1250000000"indexName := "my-index"// 先查询索引中实际存在的向量 Key,再按 500 条分批删除ctx := context.Background()listOpt := &cos.ListVectorsOptions{VectorBucketName: bucketName,IndexName: indexName,MaxResults: 1000,}allKeys := make([]string, 0, 1000)for {listRes, _, err := client.Vector.ListVectors(ctx, listOpt)if err != nil {if vecErr, ok := cos.IsVectorError(err); ok {fmt.Printf("查询向量失败,错误码: %s, 错误信息: %s, 请求ID: %s\\n",vecErr.Code, vecErr.Message, vecErr.RequestID)} else {fmt.Printf("查询向量失败: %v\\n", err)}return}for _, v := range listRes.Vectors {allKeys = append(allKeys, v.Key)}if listRes.NextToken == "" {break}listOpt.NextToken = listRes.NextToken}total := len(allKeys)if total == 0 {fmt.Println("当前索引中没有可删除的向量")return}fmt.Printf("共找到 %d 条向量,开始分批删除...\\n", total)deleteOpt := &cos.DeleteVectorsOptions{VectorBucketName: bucketName,IndexName: indexName,}batchSize := 500deletedCount := 0for i := 0; i < total; i += batchSize {end := i + batchSizeif end > total {end = total}batch := allKeys[i:end]_, err := client.Vector.DeleteVectors(ctx, deleteOpt, batch)if err != nil {if vecErr, ok := cos.IsVectorError(err); ok {fmt.Printf("第 %d 批删除失败,错误码: %s, 错误信息: %s, 请求ID: %s\\n",i/batchSize+1, vecErr.Code, vecErr.Message, vecErr.RequestID)} else {fmt.Printf("第 %d 批删除失败: %v\\n", i/batchSize+1, err)}return}deletedCount += len(batch)fmt.Printf("第 %d 批删除成功: %d 条,累计 %d/%d\\n", i/batchSize+1, len(batch), deletedCount, total)}fmt.Printf("全部删除完成,共删除 %d 条向量\\n", deletedCount)}