SonnetDB 向量运算符:语法与迁移边界
SonnetDB 支持在 SQL 表达式中写入<=>、<->和<#>这三种向量运算符。迁移已有查询时,除了语法,还要逐项核对数值符号、排序方向、schema 和索引执行路径。
本篇按 2026 年 10 月 10 日的当前解析器与标量函数源码说明实际行为,不把相似写法视为完整的 pgvector 迁移兼容证明。
当前运算符映射
| 运算符 | 当前解析目标 | 返回值 |
|---|---|---|
<=> | cosine_distance(a,b) | 1 - cosine_similarity(a,b) |
<-> | l2_distance(a,b) | 欧氏距离 |
<#> | inner_product(a,b) | 正点积sum(a_i*b_i) |
当前解析器将这三种运算符直接构造为对应函数调用。尤其要核对<#>:本篇所查路径没有再取负号,不能把它写成负内积。这个行为与 KNN 的'inner_product'距离路径也不同,后者使用负点积来保持距离升序排序。
表达式示意
假设已有名为documents的 measurement,其中embedding是 4 维 VECTOR 字段,title、source是相应的业务字段:
SELECTtitle,embedding<=>[0.10,0.20,0.30,0.40]AScos_dist,embedding<->[0.10,0.20,0.30,0.40]ASl2_dist,embedding<#> [0.10, 0.20, 0.30, 0.40] AS dot_prodFROMdocumentsWHEREsource='wiki';在当前映射下,上面的三列表达式分别对应以下标量函数:
SELECTcosine_distance(embedding,[0.10,0.20,0.30,0.40])AScos_dist,l2_distance(embedding,[0.10,0.20,0.30,0.40])ASl2_dist,inner_product(embedding,[0.10,0.20,0.30,0.40])ASdot_prodFROMdocuments;如果业务确实需要负点积表达式,可以显式写-inner_product(embedding, query_vector)。选择升序或降序时,要按照实际函数返回值判断,避免把相似度方向反转。
与 KNN 查询分开理解
-- KNN 的 inner_product 距离使用负点积,按距离升序召回SELECT*FROMknn(documents,embedding,[0.10,0.20,0.30,0.40],3,'inner_product');运算符或标量函数出现在 SELECT、WHERE、ORDER BY 中,不代表自动改写为 KNN,也不保证使用向量索引。KNN 的候选、索引匹配和回退规则需要另行核对。
迁移前的检查项
- 核对每种运算符的返回值和符号,使用可手算的小向量检查预期排序。
- 核对原系统的表、主键、字段类型、时间维度和写入模型,不能仅靠改表名或列名完成迁移。
- 双向量标量函数要求维度相同;当前标量余弦函数拒绝零向量,KNN 余弦距离 facade 的零向量处理另有合同。
- 分开验证表达式数值、检索结果、索引命中、真实模型质量和性能;语法解析不替代这些验收。
本次完成源码审阅,没有执行示例 SQL、迁移数据或测量性能。后续实现若改变运算符语义,应以对应版本的源码与实际回归结果重新核对。