You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:40:20