What a DJ Set Taught Me About Search

Two in the morning, no search box, four seconds to find a record. Why the search in my product is deliberately the stupidest one I could build.

Date

/

Category

Music

Music

/

Writer

Keon Hwui Kim

Keon Hwui Kim

Two in the morning, third hour, and I am looking for a record.

Not browsing. Looking. I know exactly which one: the one with the dry kick and the string stab that comes in late, the one I have not played in about four months. I am going through the crate with my fingers while something else plays and about eighty people carry on not noticing.

I find it in roughly four seconds. No search box. No relevance score. Nothing suggested it to me.

Hands browsing records on a shop shelf

Fig. 1. Photograph by Edu Grande, CC0, via Wikimedia Commons.

What a crate actually is

A crate is not organised. This is worth saying plainly, because DJs talk endlessly about organisation and almost none of that talk survives contact with a real night.

The crate is roughly grouped, mostly by when things went in, and it is small enough that going through it linearly is faster than operating any system for not going through it linearly. Sixty records, maybe eighty. You can get from one end to the other in under a minute.

And critically: everything in it, I put in it. There is no discovery feed in a crate. Nothing arrived. Every record is there because at some point I heard it, decided, paid for it, and carried it.

That deliberateness does enormous work, and it is invisible until you try to design a system without it. When I go through the crate I am not separating signal from noise. There is no noise. There is only material I chose, and the question is only which one.

Why my product's search is deliberately stupid

This is an argument I lost internally and then realised I was glad to have lost.

JEFIELD's search has no ranking. No fuzzy matching. No stemming. No semantic similarity. No embeddings. The rule is brutally literal: every word you type must appear, literally, in the thing. Matched characters are marked. Results are not scored, because there is no score. Order is by time.

// The entire matching rule.

match(query, item) =
    every word in query
    appears literally
    somewhere in item's searchable text

// No ranking function. No threshold.
// No "did you mean". No partial credit.
// The result set is a fact, not an opinion.
// The entire matching rule.

match(query, item) =
    every word in query
    appears literally
    somewhere in item's searchable text

// No ranking function. No threshold.
// No "did you mean". No partial credit.
// The result set is a fact, not an opinion.
// The entire matching rule.

match(query, item) =
    every word in query
    appears literally
    somewhere in item's searchable text

// No ranking function. No threshold.
// No "did you mean". No partial credit.
// The result set is a fact, not an opinion.

Every instinct I have as a designer said this was lazy. Ranking is table stakes. Fuzzy matching forgives typos. Semantic search finds the thing you meant rather than the thing you typed. All true, and all of it is solving a problem this collection does not have.

Ranking exists to solve abundance

Ranking is a response to scale plus noise: a million documents, most irrelevant, and the system must guess which ones you mean. That problem is real on the web, where the corpus is everything and you chose none of it.

It does not exist in a crate. The crate contains only things you chose. There is nothing to rank away.

And ranking has a cost people rarely state

Here is the argument that actually changed my mind, and it is not about quality.

Ranking makes absence ambiguous.

When a ranked search returns nothing useful, you cannot tell whether the thing is absent or whether the ranker put it below the fold. You have lost the ability to conclude. So you search again with different words, and again, and the not-finding becomes an open-ended activity with no natural end.

A literal match is different. If every word you typed is not in it, it is not there. You know that with certainty, in one attempt, and you can stop.


Ranked search

Literal match

Best case

Finds what you meant

Finds what you typed

Typo

Forgiven

Fails, visibly

Empty result means

Maybe absent, maybe ranked low

Absent

You can stop searching

Never certain

Immediately

Right for

A corpus you did not choose

A corpus you did

Table 1. The trade is not quality against simplicity. It is recall against the ability to conclude.

Where it does get clever, and only there

There is one exception, and it is not about ranking. The search reads the log and what the thing itself says: a document's own text, a page's title and description, the contents of an archive, the host of a link.

So typing 용역 finds a contract whose filename is 계약서 최종본.pdf and whose only occurrence of that word is inside the bytes of the file.

That is not intelligence. It is reading. The system looked inside rather than guessing from the label, and then reported literally what it found.

Which is exactly what pulling a record halfway out and looking at the centre label is. You are not asking the crate a question. You are looking at the thing.

A stylus in a record groove, closely photographed

Fig. 2. Photograph by Franz van Duns, CC BY-SA 4.0, via Wikimedia Commons.

The part that does not transfer

I should be honest about the limit of the analogy, because it is real.

A crate works at sixty records. It does not work at six thousand, which is why DJs with large libraries use software with tags, key detection, energy ratings and smart playlists. At sufficient scale the linear pass stops being viable and structure becomes genuinely necessary.

So the honest version of my position is not "ranking is bad." It is: ranking is a scale technology, and applying it before you have the scale costs you certainty for nothing. The failure mode of building it early is not that it performs badly. It is that it makes every empty result unfalsifiable, permanently, from day one.

I will need to revisit this. The trigger is specific and written down: when a real search on a real collection fails in a way literal matching caused, and it happens more than once.

The thing I actually took away

There is a kind of design confidence that only comes from knowing the contents were curated, and it lets you remove machinery rather than add it.

Most software cannot have that confidence, because most software holds material the user did not choose: feeds, inboxes, synced folders, shared drives, recommendations. Abundance forces cleverness, and the cleverness then has to be maintained, tuned, and explained.

But if you are building something where every single item was deliberately placed by one person, you have a crate. You should design like it. Small, linear, literal, and fast enough that thinking about how to search is slower than simply going through it.

Four seconds, with a record still playing, and nobody noticing anything happened at all.

Sources

  • Photograph by Edu Grande, CC0, via Wikimedia Commons. commons.wikimedia.org/wiki/File:Browsing_record_store_shelves_(Unsplash).jpg

  • Photograph by Franz van Duns, CC BY-SA 4.0, via Wikimedia Commons. commons.wikimedia.org/wiki/File:Groove_and_needle_in_close_embrace_from_beginning_to_end.jpg

Related reading

More from the Moc Mallen Studio journal