在 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;
这类问题以前遇到过,但这次的触发条件和上次不一样。
这类改动我都写进变更记录,过两周再出问题时能对上号。
恢复的判定其实很直接。查询能正常返回按距离排序的结果,执行计划里用上了向量索引,耗时明显下降。
参数类型不匹配时报的是运算符不存在,看起来像没装扩展,其实是类型推断失败,先转型再怀疑环境。报错文案容易误导,真正的原因往往在相邻那一层的日志里。