The brief
The support team wanted one box that finds anything: an order, a customer, a refund, a note left on a ticket three months ago. The old search matched exact strings, so a typo or a nickname came back empty.
We gave ourselves six weeks and one rule: nobody should need to know how the data is stored to find it.
Constraints first
Before touching a model we wrote down what the search could never do: leak a record across workspaces, take longer than a keystroke to answer, or bury an exact match under a clever one.
Those three lines settled more arguments than any benchmark. Every idea after that was measured against them first.
Signals over strings
Text is only one signal. Who opened a record last, how recently it changed and whether it is still open all say more about what someone wants than the words they type.
We index those signals next to the text, so a half-remembered name still finds the customer you spoke to this morning.
Ranking, not filtering
Filters make people guess the right bucket before they search. Ranking lets them type and trust the order.
Everything that matches stays in the list; the signals only decide what comes first. An exact match always wins, which keeps the clever part honest.
Shipping it fast
We shipped behind a flag to one team, then watched the queries that came back empty. Each one became a test.
Two weeks later the empty rate had halved, and the flag came off for everyone.