Golang操作Milvus向量数据库教程

最近在学习用Golang操作Milvus向量数据库,但遇到一些问题想请教大家:

  1. 如何用Golang连接Milvus数据库?需要安装哪些依赖包?
  2. 在Golang中创建集合和分区的最佳实践是什么?
  3. 插入向量数据时有哪些需要注意的细节?
  4. 查询向量时如何设置搜索参数才能获得最佳性能?
  5. 有没有完整的Golang操作Milvus的代码示例可以参考?

新手入门遇到不少坑,希望有经验的大佬能分享下实战经验,谢谢!

2 回复

以下是一个简单的Golang操作Milvus 2.x的入门教程:

  1. 安装依赖
go get github.com/milvus-io/milvus-sdk-go/v2
  1. 基础代码示例
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)
}
  1. 关键步骤
  • 使用NewClient建立连接
  • entity.Schema定义表结构
  • 通过Insert插入向量数据
  • 使用Search进行相似性搜索
  1. 注意事项
  • 确保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)

关键注意事项:

  1. 确保Milvus服务运行(Docker或本地安装)。
  2. 向量维度需与集合定义一致。
  3. 插入数据后建议调用Flush()确保数据持久化。
  4. 生产环境需处理错误和连接超时。

通过以上步骤,您可以实现基本的Milvus向量数据库操作。更多高级功能(如标量过滤、分区管理)请参考Milvus官方文档

回到顶部