☰
SonnetDB 向量运算符:语法与迁移边界
2026/10/12 3:56:35 网站建设 项目流程

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、迁移数据或测量性能。后续实现若改变运算符语义,应以对应版本的源码与实际回归结果重新核对。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询