Golang操作Milvus向量数据库教程
最近在学习用Golang操作Milvus向量数据库,但遇到一些问题想请教大家:
- 如何用Golang连接Milvus数据库?需要安装哪些依赖包?
- 在Golang中创建集合和分区的最佳实践是什么?
- 插入向量数据时有哪些需要注意的细节?
- 查询向量时如何设置搜索参数才能获得最佳性能?
- 有没有完整的Golang操作Milvus的代码示例可以参考?
新手入门遇到不少坑,希望有经验的大佬能分享下实战经验,谢谢!
2 回复
以下是一个简单的Golang操作Milvus 2.x的入门教程:
- 安装依赖
go get github.com/milvus-io/milvus-sdk-go/v2
- 基础代码示例
package main
import (
"context"
"fmt"
"github.com/milvus-io/milvus-sdk-go/v2/client"
"github.com/milvus-io/milvus-sdk-go/v2/entity"
)
func main() {
// 连接Milvus
cli, err := client.NewClient(context.Background(),
client.Config{Address: "localhost:19530"})
if err != nil {
panic(err)
}
// 创建集合
schema := &entity.Schema{
CollectionName: "test_collection",
Fields: []*entity.Field{
{Name: "ID", DataType: entity.FieldTypeInt64, IsPrimaryKey: true},
{Name: "vector", DataType: entity.FieldTypeFloatVector, Dim: 128},
},
}
err = cli.CreateCollection(context.Background(), schema, 2)
// 插入向量
vectors := [][]float32{{0.1, 0.2, ...}} // 128维向量
ids := []int64{1}
_, err = cli.Insert(context.Background(), "test_collection", "",
entity.NewColumnInt64("ID", ids),
entity.NewColumnFloatVector("vector", 128, vectors))
// 搜索
sp, _ := entity.NewIndexFlatSearchParam()
results, _ := cli.Search(context.Background(), "test_collection",
[]string{}, "vector == $1", []string{"vector"},
[][]float32{{0.1, 0.2, ...}}, "vector",
entity.L2, 10, sp)
fmt.Println(results)
}
- 关键步骤
- 使用
NewClient
建立连接 - 用
entity.Schema
定义表结构 - 通过
Insert
插入向量数据 - 使用
Search
进行相似性搜索
- 注意事项
- 确保Milvus服务已启动
- 向量维度需与定义一致
- 搜索时指定相似度计算方式(如L2、IP等)
建议先通过Milvus官方文档了解基本概念,再结合SDK文档深入学习。
更多关于Golang操作Milvus向量数据库教程的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
以下是使用Go语言操作Milvus向量数据库的简明教程,涵盖连接、集合管理、数据插入和查询等基本操作。使用官方Go SDK github.com/milvus-io/milvus-sdk-go/v2
。
1. 安装SDK
go get github.com/milvus-io/milvus-sdk-go/v2
2. 连接Milvus
package main
import (
"context"
"fmt"
"github.com/milvus-io/milvus-sdk-go/v2/client"
)
func main() {
// 连接参数
milvusHost := "localhost"
milvusPort := "19530"
// 创建客户端
cli, err := client.NewClient(context.Background(), client.Config{
Address: milvusHost + ":" + milvusPort,
})
if err != nil {
panic("连接失败: " + err.Error())
}
defer cli.Close()
fmt.Println("成功连接Milvus!")
}
3. 创建集合
定义包含向量字段的集合结构:
// 定义集合结构
collectionName := "test_go"
schema := &entity.Schema{
CollectionName: collectionName,
Description: "测试集合",
Fields: []*entity.Field{
{
Name: "id",
DataType: entity.FieldTypeInt64,
PrimaryKey: true,
AutoID: true,
},
{
Name: "vector",
DataType: entity.FieldTypeFloatVector,
TypeParams: map[string]string{
"dim": "128", // 向量维度
},
},
},
}
// 创建集合
err = cli.CreateCollection(context.Background(), schema, 2) // 2是分片数
if err != nil {
panic("创建集合失败: " + err.Error())
}
4. 插入向量数据
// 生成示例向量数据
vectors := [][]float32{
{0.1, 0.2, ..., 0.128}, // 128维向量
{0.2, 0.3, ..., 0.127},
}
// 转换数据格式
vecColumn := entity.NewColumnFloatVector("vector", 128, vectors)
// 插入数据
_, err = cli.Insert(context.Background(), collectionName, "", vecColumn)
if err != nil {
panic("插入数据失败: " + err.Error())
}
5. 创建索引(加速查询)
index, err := entity.NewIndexIvfFlat(entity.L2, 128) // L2距离,128个聚类中心
if err != nil {
panic("创建索引失败: " + err.Error())
}
err = cli.CreateIndex(context.Background(), collectionName, "vector", index, false)
if err != nil {
panic("构建索引失败: " + err.Error())
}
6. 向量相似度搜索
// 准备查询向量
queryVector := []float32{0.1, 0.2, ..., 0.128}
sp, _ := entity.NewIndexIvfFlatSearchParam(16) // 搜索参数
// 执行搜索
results, err := cli.Search(context.Background(), collectionName, []string{}, "id > 0",
[]string{"id"}, []entity.Vector{queryVector}, "vector", entity.L2, 10, sp)
if err != nil {
panic("搜索失败: " + err.Error())
}
// 输出结果
for _, result := range results {
for _, item := range result.IDs.(*entity.ColumnInt64).Data() {
fmt.Printf("匹配ID: %d\n", item)
}
}
7. 删除集合(清理)
cli.DropCollection(context.Background(), collectionName)
关键注意事项:
- 确保Milvus服务运行(Docker或本地安装)。
- 向量维度需与集合定义一致。
- 插入数据后建议调用
Flush()
确保数据持久化。 - 生产环境需处理错误和连接超时。
通过以上步骤,您可以实现基本的Milvus向量数据库操作。更多高级功能(如标量过滤、分区管理)请参考Milvus官方文档。