Difficulty: Hard · Priority: Critical
Overview
listSamples() only supports exact-match genre/uploader filters and one fixed sort order — no text search, no price/BPM range, no relevance ranking. Add real search to the samples API.
Acceptance Criteria
Technical Approach
Add a generated tsvector column + GIN index, rank with ts_rank/websearch_to_tsquery, combine with existing/extended range filters in one query. Layer onto the existing list endpoint rather than a new API surface.
Combining relevance ranking with multiple structured filters and pagination in one indexed query (without falling off the GIN index) is the hard part — every write path also has to keep the index in sync.
Difficulty: Hard · Priority: Critical
Overview
listSamples()only supports exact-matchgenre/uploaderfilters and one fixed sort order — no text search, no price/BPM range, no relevance ranking. Add real search to the samples API.Acceptance Criteria
Technical Approach
Add a generated
tsvectorcolumn + GIN index, rank withts_rank/websearch_to_tsquery, combine with existing/extended range filters in one query. Layer onto the existing list endpoint rather than a new API surface.Combining relevance ranking with multiple structured filters and pagination in one indexed query (without falling off the GIN index) is the hard part — every write path also has to keep the index in sync.