bookwiz.io / supabase / migrations / 032_fix_vector_operator.sql
032_fix_vector_operator.sql
Raw
-- Fix vector operator issue in semantic search
-- The issue is that the <=> operator is not found, indicating pgvector extension issues

-- Ensure pgvector extension is available
CREATE EXTENSION IF NOT EXISTS vector;

-- Drop and recreate the semantic search function with proper vector handling
DROP FUNCTION IF EXISTS semantic_search(UUID, vector, FLOAT, INTEGER);

-- Recreate the function with explicit vector schema references
CREATE OR REPLACE FUNCTION semantic_search(
    search_book_id UUID,
    query_embedding vector(1536),
    similarity_threshold FLOAT DEFAULT 0.7,
    max_results INTEGER DEFAULT 20
)
RETURNS TABLE(
    chunk_id UUID,
    file_id UUID,
    file_name TEXT,
    content TEXT,
    similarity FLOAT,
    line_start INTEGER,
    line_end INTEGER
) 
SECURITY DEFINER
SET search_path = public, extensions
AS $$
BEGIN
    RETURN QUERY
    SELECT 
        fc.id as chunk_id,
        fc.file_id,
        fsi.name as file_name,
        fc.content,
        (1 - (fc.embedding <-> query_embedding)) as similarity,
        fc.line_start,
        fc.line_end
    FROM file_chunks fc
    JOIN file_system_items fsi ON fc.file_id = fsi.id
    WHERE fc.book_id = search_book_id
    AND (1 - (fc.embedding <-> query_embedding)) > similarity_threshold
    ORDER BY fc.embedding <-> query_embedding
    LIMIT max_results;
END;
$$ LANGUAGE plpgsql;

-- Create vector index for better performance (if not exists)
DO $$
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM pg_indexes 
        WHERE tablename = 'file_chunks' 
        AND indexname = 'idx_file_chunks_embedding'
    ) THEN
        CREATE INDEX idx_file_chunks_embedding ON file_chunks 
        USING ivfflat (embedding vector_cosine_ops) 
        WITH (lists = 100);
    END IF;
END $$;