从 pgvector 迁移到 SonnetDB:运算符兼容性与 SQL 差异
pgvector 是 PostgreSQL 生态中最流行的向量扩展。SonnetDB 在设计上充分考虑 pgvector 用户的迁移体验,在运算符层面做了完整兼容。本文将详细介绍两者差异以及迁移要点。
运算符兼容
SonnetDB 完全兼容 pgvector 的三个核心距离运算符。内部通过 SQL 解析层将其映射到 VectorDistance.Compute() 方法:
| pgvector 运算符 | SonnetDB 运算符 | KnnMetric | 内部实现 |
|---|---|---|---|
<-> |
<-> |
L2 | ComputeL2(a, b) |
<=> |
<=> |
Cosine | ComputeCosine(a, b) |
<#> |
<#> |
InnerProduct | ComputeNegativeInnerProduct(a, b) |
-- pgvector 写法
SELECT id, embedding <=> '[0.1, 0.2, 0.3]' AS distance
FROM items ORDER BY distance LIMIT 5;
-- SonnetDB 写法 —— 完全一致
SELECT id, embedding <=> '[0.1, 0.2, 0.3]' AS distance
FROM items ORDER BY distance LIMIT 5;
类型定义差异
pgvector 通过扩展 CREATE EXTENSION vector 引入 vector(n) 类型。SonnetDB 则将 VECTOR 作为内建类型:
-- pgvector
CREATE EXTENSION vector;
CREATE TABLE items (id SERIAL, embedding vector(384));
-- SonnetDB
CREATE MEASUREMENT items (
content TAG,
embedding FIELD VECTOR(384)
);
SonnetDB 使用 measurement(时序表)模型,包含隐式的 time 时间戳列和 TAG 标签体系,这与关系型表的语义有所不同。
knn() 表值函数——SonnetDB 的独特优势
pgvector 只能通过 ORDER BY + LIMIT 做向量搜索,而 SonnetDB 提供了更简洁的 knn() 表值函数,自动返回 distance 列,且可配合 WHERE 条件过滤:
-- pgvector 风格
SELECT id, content FROM items
ORDER BY embedding <=> '[0.1, 0.2, 0.3]' LIMIT 5;
-- SonnetDB knn() 风格
SELECT id, content, distance
FROM knn(items, embedding, [0.1, 0.2, 0.3], 5, 'cosine')
WHERE distance < 0.4;
knn() 会自动利用 HNSW 索引加速,无需修改查询语法。
索引差异
pgvector 需要手动指定索引类型和距离运算符(如 vector_cosine_ops)。SonnetDB 则自动为 VECTOR 列构建 HNSW 索引:
-- pgvector: 手动创建 IVFFlat 索引
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
-- SonnetDB: 自动构建 HNSW 索引,零配置
-- 索引参数通过 DDL 中的 WITH 子句指定
CREATE MEASUREMENT items (
content TAG,
embedding FIELD VECTOR(384)
) WITH (vector_index = 'hnsw(m=16, ef=128)');
INSERT 语法对比
-- pgvector 插入
INSERT INTO items (embedding) VALUES ('[0.1, 0.2, 0.3]'::vector);
-- SonnetDB 插入
INSERT INTO items (content, embedding, time)
VALUES ('hello', '[0.1, 0.2, 0.3]', 1776477601000);
迁移步骤
- 从 PostgreSQL 将向量数据导出为 CSV
- 在 SonnetDB 中创建 Measurement,将
vector(n)替换为VECTOR(n) - 使用
BULK INSERT导入数据 - 系统自动构建 HNSW 索引,无需手动触发
- 验证
knn()查询结果与 pgvector 一致
通过运算符兼容层,现有 pgvector 应用可以平滑迁移到 SonnetDB,同时获得自动 HNSW 索引、时序写入优化和内置 AI Copilot 等额外能力。

浙公网安备 33010602011771号