ALTER TABLE media_items ADD COLUMN IF NOT EXISTS search_vector tsvector GENERATED ALWAYS AS ( setweight(to_tsvector('english', COALESCE(title, '')), 'A') || setweight(to_tsvector('english', COALESCE(artist, '')), 'B') || setweight(to_tsvector('english', COALESCE(album, '')), 'B') || setweight(to_tsvector('english', COALESCE(genre, '')), 'C') || setweight(to_tsvector('english', COALESCE(description, '')), 'C') || setweight(to_tsvector('english', COALESCE(file_name, '')), 'D') ) STORED; CREATE INDEX IF NOT EXISTS idx_media_search ON media_items USING GIN(search_vector);