跳转至

集合管理 API

本文件面向集合管理 API 的使用者与维护者,系统性地说明集合相关的 HTTP 端点,包括:

  • POST /collections:创建集合
  • DELETE /collections/{name}:删除集合
  • GET /collections:列出集合
  • GET /collections/{name}:获取集合信息

同时,详细解释集合配置参数(如 vector_size、distance、hnsw、parameters)的作用与取值范围,并提供丰富的 JSON 示例以展示不同类型的集合创建方式(含 HNSW 参数配置与距离度量选择)。最后,说明集合生命周期管理与状态检查方法。

项目结构

该服务采用分层架构:

  • API 层:提供 HTTP 接口,路由到具体处理函数
  • 核心业务层:Collection 抽象、索引引擎(Flat/HNSW)、存储引擎(BoltDB)
  • 命令行入口:启动独立微服务模式
graph TB
subgraph "API 层"
S["Server
HTTP 路由与处理"] end subgraph "核心业务层" C["Collection
集合抽象"] I["Index
Flat/HNSW"] ST["Storage
持久化(BoltDB)"] end subgraph "命令行入口" M["main.go
启动服务"] end S --> C C --> I C --> ST M --> S

核心组件

  • Server:HTTP 服务器,负责路由与集合管理端点处理
  • Collection:集合抽象,封装向量维度、距离度量、索引与存储
  • Index:索引接口,支持 Flat 与 HNSW 两种实现
  • Storage:本地持久化引擎,基于 BoltDB 与 Protobuf
  • HNSWParams:HNSW 索引可调参数集合

架构总览

集合管理 API 的关键流程如下: - 创建集合:解析请求体,校验参数,构建 Collection 并注册到 Server - 删除集合:从 Server 移除集合实例 - 列出集合:遍历 Server 中的集合并返回基本信息 - 获取集合:返回指定集合的名称、维度、距离度量与点数

sequenceDiagram
participant Client as "客户端"
participant Server as "Server"
participant Col as "Collection"
participant Store as "Storage"
Client->>Server : "POST /collections"
Server->>Server : "解析请求体
校验参数" Server->>Col : "NewCollectionWithParams(...)" Col->>Store : "EnsureCollection / SaveCollectionMeta" Server->>Server : "注册到 collections 映射" Server-->>Client : "200 OK + 结果" Client->>Server : "DELETE /collections/{name}" Server->>Server : "从映射移除" Server-->>Client : "200 OK + 结果" Client->>Server : "GET /collections" Server->>Server : "遍历 collections" Server-->>Client : "200 OK + 列表" Client->>Server : "GET /collections/{name}" Server->>Col : "查询集合信息" Server-->>Client : "200 OK + 详情"

详细组件分析

端点规范与行为

POST /collections(创建集合)

  • 请求体字段
  • name:字符串,集合唯一标识
  • vector_size:正整数,向量维度
  • distance:字符串,距离度量,支持 "euclidean"/"Euclid"、"dot"/"Dot"、"cosine"/"Cosine"
  • hnsw:布尔值,是否使用 HNSW 索引(可选)
  • parameters:对象,HNSW 参数(可选)
    • m:整数,节点最大连接数
    • ef_construction:整数,构建时候选列表大小
    • ef_search:整数,搜索时候选列表大小
    • k:整数,返回近邻数量
  • 成功响应
  • 状态码:200
  • 返回字段:status、result.name、result.vector_size、result.distance、result.hnsw、result.parameters、result.operation
  • 错误响应
  • 400:JSON 解析失败、vector_size 非正、distance 不合法
  • 409:集合已存在
  • 500:内部错误(创建失败)

示例请求(创建 HNSW 集合,自定义参数) - 请求体 - name: "mycollection" - vectorsize: 128 - distance: "euclidean" - hnsw: true - parameters: { "m": 16, "efconstruction": 128, "efsearch": 64, "k": 10 }

示例响应 - 状态码:200 - 返回体包含集合元数据与参数

DELETE /collections/{name}(删除集合)

  • 路径参数
  • name:集合名称
  • 成功响应
  • 状态码:200
  • 返回字段:status、result.operation、result.collection
  • 错误响应
  • 404:集合不存在

GET /collections(列出集合)

  • 成功响应
  • 状态码:200
  • 返回字段:status、result(数组),每项包含 name、vectorsize、distance、pointscount
  • 错误响应
  • 无(总是 200)

GET /collections/{name}(获取集合信息)

  • 路径参数
  • name:集合名称
  • 成功响应
  • 状态码:200
  • 返回字段:status、result.name、result.vectorsize、result.distance、result.pointscount
  • 错误响应
  • 404:集合不存在

集合配置参数详解

  • vector_size(向量维度)
  • 类型:正整数
  • 作用:固定集合中向量的维度,插入与查询时必须匹配
  • 取值范围:> 0
  • 影响:内存占用、索引构建成本、查询性能

  • distance(距离度量)

  • 类型:字符串
  • 取值:"euclidean"/"Euclid"、"dot"/"Dot"、"cosine"/"Cosine"
  • 影响:相似度计算方式,决定索引与搜索策略
  • 注意:HNSW 对不同度量有不同距离函数适配

  • hnsw(是否启用 HNSW)

  • 类型:布尔值
  • 作用:控制使用 HNSW 近似最近邻索引还是 Flat 线性索引
  • 默认:true(在命令行启动时可通过参数控制)

  • parameters(HNSW 参数)

  • m:节点最大连接数,越大图越稠密,召回率越高但内存与构建时间增加
  • ef_construction:构建阶段候选列表大小,越大召回率越高但构建更慢
  • ef_search:搜索阶段候选列表大小,越大召回率越高但延迟增加
  • k:返回近邻数量(HNSW 搜索时会过采样再过滤)

集合生命周期与状态检查

  • 生命周期
  • 创建:Server.handleCreateCollection 解析请求、校验参数、创建 Collection 并注册到 Server
  • 运行:Server 维护 collections 映射,提供查询与操作
  • 删除:Server.handleDeleteCollection 从映射移除集合
  • 加载:Server.Start 启动时自动从 Storage 加载集合元数据并重建集合

  • 状态检查

  • 列表:GET /collections 返回集合基本信息(包含 points_count)
  • 详情:GET /collections/{name} 返回集合详细信息(包含 points_count)
  • 存在性:删除与查询端点在找不到集合时返回 404

  • 数据一致性

  • Collection.Upsert 先写入 Storage,再更新内存索引;若索引更新失败则尝试回滚 Storage 写入
  • Collection.Delete 支持按 ID 或按过滤条件删除,先删 Storage 再删索引

端到端序列图(创建集合)

sequenceDiagram
participant Client as "客户端"
participant Server as "Server"
participant Col as "Collection"
participant Store as "Storage"
Client->>Server : "POST /collections"
Server->>Server : "解析 JSON
校验 vector_size > 0" Server->>Server : "解析 distance -> Metric" Server->>Server : "解析 parameters -> HNSWParams" Server->>Col : "NewCollectionWithParams(name, dim, metric, store, hnsw, params)" Col->>Store : "EnsureCollection / SaveCollectionMeta" Server->>Server : "collections[name] = col" Server-->>Client : "200 OK + result"

处理逻辑流程图(创建集合)

flowchart TD
Start(["进入 handleCreateCollection"]) --> Parse["解析 JSON 请求体"]
Parse --> ValidJSON{"JSON 是否有效?"}
ValidJSON --> |否| Err400["返回 400 Bad Request"]
ValidJSON --> |是| CheckExist["检查集合是否已存在"]
CheckExist --> Exists{"已存在?"}
Exists --> |是| Err409["返回 409 Conflict"]
Exists --> |否| ValidateDim["校验 vector_size > 0"]
ValidateDim --> DimOK{"维度合法?"}
DimOK --> |否| Err400
DimOK --> ParseMetric["解析 distance -> Metric"]
ParseMetric --> MetricOK{"度量合法?"}
MetricOK --> |否| Err400
MetricOK --> ParseParams["解析 parameters -> HNSWParams"]
ParseParams --> CreateCol["NewCollectionWithParams(...)"]
CreateCol --> Reg["注册到 collections 映射"]
Reg --> Ok["返回 200 OK + result"]

依赖关系分析

graph LR
A["api/server.go"] --> B["core/collection.go"]
A --> C["core/models.go"]
B --> D["core/hnsw_index.go"]
B --> E["core/storage.go"]
F["cmd/govector/main.go"] --> A

性能考虑

  • HNSW 与 Flat 的选择
  • HNSW:适合大规模数据,查询延迟低,但构建与内存开销更高
  • Flat:简单直接,适合小规模或临时场景
  • HNSW 参数调优
  • m:影响图密度与召回,建议从默认值开始,逐步增大观察效果
  • ef_construction:构建质量与速度权衡,越大越慢但召回更好
  • ef_search:查询延迟与召回权衡,越大越慢但更准
  • k:搜索过采样倍数,结合过滤使用时建议适当放大
  • 距离度量
  • Cosine:常用于归一化向量,适合文本/图像检索
  • Euclidean:适合未归一化的欧氏空间
  • Dot:点积方向敏感,注意符号翻转的影响
  • 存储与持久化
  • 启用持久化可实现重启后自动加载集合元数据与点集
  • 支持向量量化(SQ8)降低磁盘占用与内存压力

故障排除指南

  • 创建集合报错
  • 400:检查 JSON 格式、vector_size 是否为正数、distance 是否为允许值
  • 409:集合名冲突,更换名称或先删除旧集合
  • 500:内部错误,查看服务日志定位具体原因
  • 删除集合报错
  • 404:集合不存在,确认名称正确
  • 查询集合报错
  • 404:集合不存在,确认名称正确
  • 数据不一致
  • Upsert/删除失败时,服务会尽力回滚,但仍建议检查 Storage 与索引状态

结论

集合管理 API 提供了与 Qdrant 兼容的 REST 接口,覆盖集合的创建、删除、列举与信息查询。通过 vector_size、distance、hnsw 与 parameters 等配置,用户可以灵活选择索引类型与参数,平衡召回率、延迟与资源消耗。配合持久化与量化能力,可在单机环境下实现高性能、可靠的向量检索服务。