-- Fix vector search timeout by adding document_id filtering and optimizing the query -- This prevents searching across all documents and only searches within a specific document -- Drop the old function (handle all possible signatures) DROP FUNCTION IF EXISTS match_document_chunks(vector(1536), float, int); DROP FUNCTION IF EXISTS match_document_chunks(vector(1536), float, int, text); -- Create optimized function with document_id filtering -- document_id is TEXT (varchar) in the actual schema CREATE OR REPLACE FUNCTION match_document_chunks ( query_embedding vector(1536), match_threshold float, match_count int, filter_document_id text DEFAULT NULL ) RETURNS TABLE ( id UUID, document_id TEXT, content text, metadata JSONB, chunk_index INT, similarity float ) LANGUAGE sql STABLE AS $$ SELECT document_chunks.id, document_chunks.document_id, document_chunks.content, document_chunks.metadata, document_chunks.chunk_index, 1 - (document_chunks.embedding <=> query_embedding) AS similarity FROM document_chunks WHERE document_chunks.embedding IS NOT NULL AND (filter_document_id IS NULL OR document_chunks.document_id = filter_document_id) AND 1 - (document_chunks.embedding <=> query_embedding) > match_threshold ORDER BY document_chunks.embedding <=> query_embedding LIMIT match_count; $$; -- Add comment explaining the optimization COMMENT ON FUNCTION match_document_chunks IS 'Optimized vector search that filters by document_id first to prevent timeouts. Always pass filter_document_id when searching within a specific document.';