如何在Supabase pgvector中按自定义字段过滤向量查询结果?
解决pgvector按自定义company_id过滤向量匹配的问题
你需要通过company_id字段隔离不同企业的文档数据,实现类似Pinecone的space-name功能,在向量匹配时仅返回指定企业的相关文档。当前的match_documents函数存在几个关键问题,以下是修改方案:
当前函数的问题
- 未定义
company_id参数,无法接收前端传入的企业ID - WHERE子句中
documents.custom_id = custom_id错误:表字段实际是company_id,且未引用外部参数,会导致无意义的自比较(条件永远为真) - 函数中
query_embedding的维度是vector(384),与表中embedding vector(1536)维度不匹配,会引发计算错误
修改后的完整函数
create or replace function match_documents ( query_embedding vector(1536), -- 与表中embedding维度保持一致 match_threshold float, match_count int, company_id text -- 添加company_id参数 ) returns table ( id bigint, content text, similarity float, company_id text -- 可选:返回company_id方便验证 ) language sql stable as $$ select documents.id, documents.content, 1 - (documents.embedding <=> query_embedding) as similarity, documents.company_id from documents where 1 - (documents.embedding <=> query_embedding) > match_threshold and documents.company_id = match_documents.company_id -- 使用函数参数匹配表字段 order by similarity desc limit match_count; $$;
关键修改说明
- 添加
company_id text作为函数参数,接收前端传入的企业ID - 统一
query_embedding的维度为vector(1536),与表中定义一致 - WHERE子句中明确使用
match_documents.company_id(函数参数)匹配表中的documents.company_id,实现数据隔离 - 可选:在返回结果中加入
company_id,方便验证返回数据的归属
前端调用注意事项
确保传入有效的company_id值,示例:
const { data: documents, error } = await supabaseClient.rpc('match_documents', { query_embedding: embedding, match_threshold: .73, match_count: 10, company_id: "your_company_unique_id" // 传入目标企业的ID })
内容的提问来源于stack exchange,提问作者Santiago Padilla
相关产品推荐
相关产品推荐

