39 lines
1.1 KiB
MySQL
39 lines
1.1 KiB
MySQL
|
|
-- Migration 023: Document Full-Text Search
|
||
|
|
-- Adds tsvector column and GIN index for fast document searching
|
||
|
|
|
||
|
|
-- Add search vector column
|
||
|
|
ALTER TABLE public.documents
|
||
|
|
ADD COLUMN IF NOT EXISTS search_vector tsvector;
|
||
|
|
|
||
|
|
-- Populate existing documents
|
||
|
|
UPDATE public.documents
|
||
|
|
SET search_vector = to_tsvector('english',
|
||
|
|
coalesce(title, '') || ' ' ||
|
||
|
|
coalesce(description, '') || ' ' ||
|
||
|
|
coalesce(file_name, '')
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Create GIN index for fast full-text search
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_documents_search
|
||
|
|
ON public.documents USING GIN (search_vector);
|
||
|
|
|
||
|
|
-- Create trigger to keep search_vector updated
|
||
|
|
CREATE OR REPLACE FUNCTION update_document_search_vector()
|
||
|
|
RETURNS TRIGGER AS $$
|
||
|
|
BEGIN
|
||
|
|
NEW.search_vector := to_tsvector('english',
|
||
|
|
coalesce(NEW.title, '') || ' ' ||
|
||
|
|
coalesce(NEW.description, '') || ' ' ||
|
||
|
|
coalesce(NEW.file_name, '')
|
||
|
|
);
|
||
|
|
RETURN NEW;
|
||
|
|
END;
|
||
|
|
$$ LANGUAGE plpgsql;
|
||
|
|
|
||
|
|
DROP TRIGGER IF EXISTS trg_update_document_search ON public.documents;
|
||
|
|
CREATE TRIGGER trg_update_document_search
|
||
|
|
BEFORE INSERT OR UPDATE OF title, description, file_name
|
||
|
|
ON public.documents
|
||
|
|
FOR EACH ROW
|
||
|
|
EXECUTE FUNCTION update_document_search_vector();
|