做 RAG、语义检索或推荐时,要把 Embedding 向量 存起来、按相似度查,就得用向量数据库。Go 里常见的选择有三类:Pgvector(PostgreSQL 扩展)、Milvus、Qdrant。选哪个取决于你是否已有 Postgres、数据量和运维成本。这篇就聊这三者在 Go 里的客户端选型和接入要点。
- Pgvector:是 PostgreSQL 的一个扩展,向量当一列存。适合本来就用 Postgres 的团队,不想多维护一个组件,数据量在百万级以内、QPS 不是特别夸张时很够用。Go 里用 pgx + pgvector-go 即可。
- Milvus:独立向量库,支持大规模、分布式,适合向量数据量很大或要单独扩缩容的场景。官方有 milvus-sdk-go,接口偏「集合 + 列式插入 + 建索引再搜」。
- Qdrant:也是独立向量库,API 设计偏 REST/gRPC,过滤条件(payload filter)和多向量支持比较顺手。Go 用 github.com/qdrant/go-client,文档和示例都比较全。
Pgvector:用 pgx + pgvector-go
前提:Postgres 已安装并启用 pgvector 扩展(CREATE EXTENSION vector)。Go 侧用 pgx 连库,用 pgvector-go 注册向量类型并读写。
核心流程:启用扩展 → 建表(vector(1536) 列)→ 注册向量类型 → 插入/查询(SQL + <->/<=>)。
适用场景:已有 Postgres、数据量不大、希望统一存储管理的团队。
Git 地址:
- 官方扩展:github.com/pgvector/pgvector
- Go 客户端:github.com/pgvector/pgvector-go(支持 pgx)
Milvus:用官方 Go SDK
Milvus 需要先起服务(Docker 或集群),再用 milvus-sdk-go 连。概念是 Collection(类似表)、Field(含主键、向量列等),插入要按列组织数据,查询前要建索引并 LoadCollection。
核心流程:建 Collection → 列式 Insert → 建索引 → LoadCollection → Search。
适用场景:向量量大、要独立扩展的场景。
Git 地址:
- 官方仓库:github.com/milvus-io/milvus(向量数据库)
- Go SDK:github.com/milvus-io/milvus-sdk-go(官方 Go 客户端)
Qdrant:用 go-client
Qdrant 提供 go-client,支持 gRPC。概念是 Collection、Point(id + vector + payload),插入用 Upsert,查询用 Search。
核心流程:创建 Collection → Upsert points → Search(可带 payload 过滤)。
适用场景:需要过滤、多向量、接口顺手的项目。
Git 地址:
- 官方仓库:github.com/qdrant/qdrant(向量数据库)
- Go 客户端:github.com/qdrant/go-client(支持 gRPC)
写在最后
- Pgvector:Postgres 扩展,Go 用 pgx + pgvector-go,建表带
vector(N)列,插入/查询用 SQL +<->/<=>,适合已有 PG、数据量不大的场景。 - Milvus:独立向量库,Go 用 milvus-sdk-go,流程是建 Collection → 列式 Insert → 建索引 → LoadCollection → Search,适合大规模、需独立扩展。
- Qdrant:独立向量库,Go 用 go-client,CreateCollection → Upsert points → Search(可带 payload 过滤),适合检索条件多、接口顺手的场景。