从 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);

迁移步骤

  1. 从 PostgreSQL 将向量数据导出为 CSV
  2. 在 SonnetDB 中创建 Measurement,将 vector(n) 替换为 VECTOR(n)
  3. 使用 BULK INSERT 导入数据
  4. 系统自动构建 HNSW 索引,无需手动触发
  5. 验证 knn() 查询结果与 pgvector 一致

通过运算符兼容层,现有 pgvector 应用可以平滑迁移到 SonnetDB,同时获得自动 HNSW 索引、时序写入优化和内置 AI Copilot 等额外能力。

posted @ 2026-05-15 16:15  IoTSharp  阅读(7)  评论(0)    收藏  举报