在 PostgreSQL 里执行相似度查询,报 operator does not exist: vector <-> double precision[],明明已经装了扩展。

一开始怀疑是「扩展装在另一个 schema 下,函数不可见」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。查询参数传的是数组,没有转成 vector 类型。也可能是列类型建成了 real[] 而不是 vector。

另外,Python 驱动把列表序列化成了字符串。

显式把参数转成 vector 类型

SELECT id FROM docs ORDER BY embedding <-> %s::vector LIMIT 5;

再往下确认列的实际类型

python -c "print(cur.execute('\\d docs').fetchall())"

接着扩展未安装时先创建

CREATE EXTENSION IF NOT EXISTS vector;

剩下的就是检查 schema 搜索路径

SHOW search_path;

这类问题以前遇到过,但这次的触发条件和上次不一样。

这类改动我都写进变更记录,过两周再出问题时能对上号。

恢复的判定其实很直接。查询能正常返回按距离排序的结果,执行计划里用上了向量索引,耗时明显下降。

参数类型不匹配时报的是运算符不存在,看起来像没装扩展,其实是类型推断失败,先转型再怀疑环境。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189