删除向量

最近更新时间:2026-04-01 15:41:32

我的收藏

简介

本文档介绍如何使用对象存储 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
如果请求失败,将返回非 nilerror。向量检索相关的业务错误(如资源不存在等)会封装为 *cos.VectorErrorResponse 结构,您可以通过 cos.IsVectorError() 辅助函数判断并获取详细错误信息。详细的错误处理方式、VectorErrorResponse 结构体说明及服务端错误码列表请参见 异常处理 文档。

使用案例

案例一:删除指定向量

package main

import (
"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 main

import (
"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 := 500
deletedCount := 0

for i := 0; i < total; i += batchSize {
end := i + batchSize
if 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)
}