Filters are hard constraints. A chunk must match every filter to be scored and returned. They run against the redb metadata store using precomputed bitsets, so they resolve in microseconds.
All filters in the filters object combine as AND. There is no OR operator at the top level. Use "in" for multi-value matching on a single field.
Recency bias favors newer content without hiding older content. Old chunks score lower but still appear. The decay is exponential: score *= max(min_score, 2^(-age_days / half_life_days)). A chunk with a 30-day half-life at age 30 days scores 0.5x what it would have scored at age 0.
The recency_field tells Compass which metadata field holds the timestamp. Compass never assumes a default.
For full control, use recency instead. This overrides any preset:
half_life_days: time in days after which a chunk’s recency contribution is halved. min_score: floor value so older chunks never fully disappear. Both are required when using the recency object.
Boosts are multiplicative score additions applied after retrieval. A chunk that matches a boost condition gets its score multiplied by weight. Chunks that don’t match the condition are unaffected.
Boost fields:
Use value for exact match. Use gte/lte for numeric range conditions. Both gte and lte can appear in the same boost entry.
In mode: "hybrid", BM25 and HNSW scores are merged via RRF. Three parameters control the blend:
For transcript search where exact speaker names and technical terms matter, try fts_weight: 2.0, semantic_weight: 0.5. For open-ended queries against visual content, try semantic_weight: 2.0, fts_weight: 0.5.