# collections.search-text
Case folding is ASCII only: A-Z fold to a-z and nothing else changes.
JavaScript's toLowerCase, Python's str.lower and Rust's to_lowercase all
implement full Unicode case mapping and disagree in the corners (Turkish dotted
I, final sigma, German sharp s), so 'E' matches 'e' but 'E-acute' does not match
'e-acute'. Fold or transliterate the query yourself if you need more than that -
text.slugify is one way.
An empty query returns every record, including records that carry none of the
named fields. 'No filter typed yet' means 'show me everything', which is what
every search box in the world does.
An empty field list is an error. Silently matching nothing is the classic bug
that reaches users as 'search is broken' with no other symptom.
Only strings, integers and booleans are searchable, so '17' finds the record
whose id is 17 and 'true' finds the active ones. A float is skipped rather than
matched, because no decimal rendering of it is identical in all three languages,
and so are lists, maps, nulls and missing fields - a record is simply not
matched on a field it has nothing searchable in.
Matching is a plain substring test, not a word, prefix or fuzzy match. Order is
the input order, never relevance: this capability filters, it does not rank.