快速开始¶
本指南面向首次接触 GoVector 的用户,目标是在约 15 分钟内完成环境搭建,并运行第一个向量搜索示例。内容覆盖:
- 作为 Go 库导入与 Homebrew 安装两种方式
- 嵌入式模式(零网络开销)的完整流程:初始化存储、创建集合、插入向量、查询与过滤
- 微服务模式(HTTP API)的启动与基础调用
- 常见初始化步骤、错误处理与最佳实践
- 故障排除与常见问题
项目结构¶
仓库采用按“功能域+层次”混合组织方式:
- 核心库位于 core/,提供存储、集合、索引、模型等能力
- API 层位于 api/,提供 Qdrant 兼容的 HTTP 接口
- 可执行程序位于 cmd/govector/main.go,作为独立服务
- 示例位于 example/embedded/main.go,展示嵌入式用法
- Homebrew 脚本位于 scripts/release/govector.rb
- 性能基准与脚本位于 cmd/bench/ 与 demo.sh
graph TB
subgraph "应用层"
APP["你的 Go 应用
或命令行脚本"]
end
subgraph "GoVector 核心"
CORE_STORAGE["core/Storage
持久化(BoltDB)"]
CORE_COLLECTION["core/Collection
集合管理"]
CORE_MODELS["core/* 模型与过滤器"]
CORE_INDEX["core/VectorIndex 接口"]
end
subgraph "API 层"
API_SERVER["api/Server
HTTP API"]
end
subgraph "可执行程序"
BIN_MAIN["cmd/govector/main.go
微服务入口"]
end
APP --> CORE_COLLECTION
CORE_COLLECTION --> CORE_STORAGE
CORE_COLLECTION --> CORE_INDEX
API_SERVER --> CORE_COLLECTION
BIN_MAIN --> API_SERVER
BIN_MAIN --> CORE_STORAGE
核心组件¶
- 存储引擎 Storage:基于 bbolt 的本地持久化,支持点的增删改查、集合元数据管理、可选向量量化
- 集合 Collection:逻辑集合,封装索引与存储,提供 Upsert/Search/Delete 等线程安全操作
- 模型与过滤:PointStruct、ScoredPoint、Filter、Condition 等,支持多种匹配类型
- 索引接口 VectorIndex:统一 Flat/HNSW 等不同索引策略
- API Server:提供 Qdrant 兼容的 REST 接口,支持集合管理与点操作
架构总览¶
下图展示了嵌入式与微服务两种模式的交互关系与数据流。
graph TB
subgraph "嵌入式模式"
E_APP["你的应用代码"]
E_STORE["core/Storage"]
E_COL["core/Collection"]
E_IDX["VectorIndex(HNSW/Flat)"]
E_APP --> E_STORE
E_APP --> E_COL
E_COL --> E_IDX
E_COL --> E_STORE
end
subgraph "微服务模式"
S_CLI["客户端/脚本(curl)"]
S_API["api/Server(HTTP)"]
S_BIN["cmd/govector/main.go"]
S_STORE["core/Storage"]
S_COL["core/Collection"]
S_IDX["VectorIndex(HNSW/Flat)"]
S_CLI --> S_API
S_BIN --> S_API
S_BIN --> S_STORE
S_API --> S_COL
S_COL --> S_STORE
S_COL --> S_IDX
end
详细组件分析¶
嵌入式模式:从零到一的完整示例¶
嵌入式模式适合直接在你的 Go 应用中使用,无需网络开销。典型流程如下: 1) 初始化本地存储(创建数据库文件) 2) 创建集合(指定维度、距离度量、是否启用 HNSW) 3) 批量写入向量(Upsert) 4) 执行相似度检索(Search),可带 Payload 过滤 5) 关闭存储释放资源
sequenceDiagram
participant App as "你的应用"
participant Store as "core/Storage"
participant Col as "core/Collection"
participant Idx as "VectorIndex"
App->>Store : 初始化存储(路径)
App->>Col : 创建集合(名称, 维度, 度量, 存储, 是否HNSW)
App->>Col : Upsert(向量+元数据)
Col->>Store : 写入持久化
Col->>Idx : 更新内存索引
App->>Col : Search(查询向量, 过滤, K)
Col->>Idx : 查询返回TopK
Col-->>App : 结果(含ID/分数/元数据)
App->>Store : 关闭存储
命令行工具 (CLI) 模式¶
GoVector 提供了强大的交互式与非交互式命令行工具,支持缩写参数。
- 启动参数与子命令
serve:启动 HTTP 服务,例如govector serve -p=18080 -d=govector.dbls:列出数据库中的所有集合,例如govector ls demo.dbupsert:写入数据,例如govector upsert demo.db -c=demo_col -j=[id:1]search:相似度检索,例如govector search demo.db -c=demo_col -v=[0.1] -l=10count:统计点数,例如govector count demo.db -c=demo_coldelete:删除数据,例如govector delete demo.db -c=demo_col -i=[1]
命令行工具 (CLI) 模式¶
GoVector 提供了强大的交互式与非交互式命令行工具,支持缩写参数。
- 启动参数与子命令
- serve:启动 HTTP 服务,例如
govector serve -p=18080 -d=govector.db - ls:列出数据库中的所有集合,例如
govector ls demo.db - upsert:写入数据,例如
govector upsert demo.db -c=demo_col -j='[{"id":"1","vector":[0.1]}]' - search:相似度检索,例如
govector search demo.db -c=demo_col -v='[0.1]' -l=10 - count:统计点数,例如
govector count demo.db -c=demo_col - delete:删除数据,例如
govector delete demo.db -c=demo_col -i='["1"]'
微服务模式:启动与基础 API 调用¶
微服务模式以 HTTP API 提供 Qdrant 兼容接口,适合独立部署或与其他语言服务集成。
- 启动命令与参数
- 端口:-port,默认 18080
- 数据库路径:-db,默认 govector.db
- 基础 API 调用(参考 demo.sh)
- 创建集合:POST /collections
- 写入向量:PUT /collections/{name}/points
- 搜索:POST /collections/{name}/points/search
- 删除:POST /collections/{name}/points/delete
- 列表/详情:GET /collections, GET /collections/{name}
sequenceDiagram
participant Client as "客户端(curl)"
participant Bin as "cmd/govector/main.go"
participant API as "api/Server"
participant Col as "core/Collection"
participant Store as "core/Storage"
Client->>Bin : 启动(端口/数据库/索引参数)
Bin->>Store : 初始化存储
Bin->>Col : 创建默认集合(维度/度量/索引)
Bin->>API : 注册集合并启动HTTP监听
Client->>API : POST /collections (创建集合)
API->>Col : 新建集合
Client->>API : PUT /collections/{name}/points (批量写入)
API->>Col : Upsert
Client->>API : POST /collections/{name}/points/search (查询)
API->>Col : Search(过滤+TopK)
Col-->>API : 返回结果
API-->>Client : JSON响应
数据模型与过滤机制¶
- PointStruct:包含 ID、向量、版本号、Payload
- ScoredPoint:查询结果,包含 ID、版本、分数、Payload
- Filter/Condition:支持 must/must_not,条件类型包括 exact、range、prefix、contains、regex
- 匹配规则:Must 全部满足且 MustNot 全不满足时才命中
flowchart TD
Start(["进入过滤匹配"]) --> NilCheck{"Filter为空?"}
NilCheck --> |是| True["返回true(无过滤)"]
NilCheck --> |否| MustAll["遍历Must条件"]
MustAll --> MustFail{"任一不满足?"}
MustFail --> |是| False["返回false"]
MustFail --> |否| MustNotAll["遍历MustNot条件"]
MustNotAll --> MustNotFail{"任一满足?"}
MustNotFail --> |是| False
MustNotFail --> |否| True
依赖关系分析¶
- 外部依赖
- bbolt:本地键值存储
- protobuf:序列化点与元数据
- hnsw:HNSW 图索引实现
- 内部模块
- core:存储、集合、索引、模型
- api:HTTP 服务器与路由
- cmd/govector:微服务入口
- example/embedded:嵌入式示例
graph LR
GOV["github.com/DotNetAge/govector"]
BBOLT["go.etcd.io/bbolt"]
PROTO["google.golang.org/protobuf"]
HNSW["github.com/coder/hnsw"]
GOV --> BBOLT
GOV --> PROTO
GOV --> HNSW
性能与最佳实践¶
- 选择合适的索引
- 小规模/开发环境:Flat 索引,简单稳定
- 生产/大规模:HNSW 索引,亚线性搜索复杂度
- 维度与度量
- 确保写入向量维度与集合一致
- Cosine/Euclidean/Dot 在不同场景下表现不同
- 写入与一致性
- Upsert 先落盘再更新内存索引;失败时尝试回滚
- 过滤与查询
- 使用 Payload 过滤减少候选集,提升查询效率
- 量化
- 可开启 SQ8 量化以降低磁盘占用,注意精度权衡
故障排除指南¶
- 启动微服务报错
- 端口被占用:修改 -port 参数
- 数据库路径权限不足:确保目录可读写
- 集合参数非法:检查集合配置参数
- 写入失败
- 向量维度不匹配:确认集合维度与向量长度一致
- 存储关闭:确保未提前 Close
- 查询异常
- 集合不存在:先创建集合或确认名称正确
- 过滤语法错误:核对 JSON 结构与字段名
- Homebrew 安装
- 权限问题:使用 sudo 或修正目录权限
- 服务无法启动:查看日志路径 var/log/govector.log
结论¶
通过本指南,你可以在 15 分钟内完成 GoVector 的安装与首次运行,掌握嵌入式与微服务两种模式的核心用法。建议优先使用嵌入式模式进行本地开发与测试,生产环境推荐 HNSW 索引与合理的过滤策略,结合量化以平衡性能与存储成本。
附录:命令与示例路径¶
- 安装(Go 库)
- 引入模块:go get github.com/DotNetAge/govector/core
- 参考路径:README.md:47-50
- 安装(Homebrew)
- brew tap DotNetAge/govector
- brew install govector
- 参考路径:README.md:52-56,scripts/release/govector.rb:1-45
- 嵌入式示例
- 示例入口:example/embedded/main.go
- 参考路径:example/embedded/main.go:10-62
- 微服务启动
- 启动命令:go run cmd/govector/main.go -port 18080 -db ./govector.db
- 参考路径:cmd/govector/main.go:18-55,Makefile:15-17
- 基础 API 调用
- demo 脚本:demo.sh
- 参考路径:demo.sh:11-38
- 关键 API 文档
- 集合管理:POST /collections, DELETE /collections/{name}, GET /collections, GET /collections/{name}
- 点操作:PUT /collections/{name}/points, POST /collections/{name}/points/search, POST /collections/{name}/points/delete
- 参考路径:api/server.go:54-95,api/server.go:145-258