Supabase中基于pgvector的SQL函数自定义过滤失效问题
解决Supabase pgvector函数中custom_id过滤失效的问题
你的SQL函数存在参数名与列名冲突的问题:函数参数custom_id和数据表documents的列名custom_id完全一致,PostgreSQL解析where documents.custom_id == custom_id时,会将右侧的custom_id识别为表的列而非函数参数,导致条件等价于documents.custom_id = documents.custom_id,所有行都满足过滤条件,最终返回全部文档。
同时你的原函数未使用match_threshold参数,这里一并补上阈值过滤逻辑,确保先按custom_id过滤,再计算相似度并筛选符合阈值的结果。
修正方案一:修改参数名避免冲突
create or replace function match_documents ( query_embedding vector(1536), match_threshold float, match_count int, p_custom_id text -- 重命名参数,避免与列名冲突 ) returns table ( id bigint, content text, similarity float ) language sql stable as $$ select documents.id, documents.content, 1 - (documents.embedding <=> query_embedding) as similarity from documents where documents.custom_id = p_custom_id -- 使用重命名后的参数 and 1 - (documents.embedding <=> query_embedding) >= match_threshold -- 应用相似度阈值 order by similarity desc limit match_count; $$;
修正方案二:用函数名限定参数
如果不想修改参数名,可通过函数名明确指定引用的是函数参数:
create or replace function match_documents ( query_embedding vector(1536), match_threshold float, match_count int, custom_id text ) returns table ( id bigint, content text, similarity float ) language sql stable as $$ select documents.id, documents.content, 1 - (documents.embedding <=> query_embedding) as similarity from documents where documents.custom_id = match_documents.custom_id -- 用函数名限定参数 and 1 - (documents.embedding <=> query_embedding) >= match_threshold order by similarity desc limit match_count; $$;
上述两种方案都会先按custom_id过滤文档,再计算向量相似度并筛选符合阈值的结果,最后返回指定数量的最相似文档。
内容的提问来源于stack exchange,提问作者Santiago Padilla
相关产品推荐
相关产品推荐

