Search, Ranked by Intent
ENTERTAINER/Search case study
Search ENTERTAINER

Search understands you. It just doesn't rank you right.

Take-home project  Â·  Focus: the search journey  Â·  Built as: a working prototype, not mockups

"We want to build a search experience that allows users to discover new offers and merchants with ease, making the most common experience in our app pleasant and fast."The brief

Search is the most common thing people do in the app, so it's the highest-leverage place to fix. Here's what's broken today, why, and what I changed, with the real working prototype embedded below.


1. What's broken

I ran four searches in the real app: "pizza near me," "pi," "amusement park" and "hotel in marina." That's not a guess. Every problem below is visible on screen, and none depends on where I happened to be standing.

If I search "pizza near me," why am I getting a spa?That question is what started this project.

The pattern repeats across categories. The words get parsed, but the ranking doesn't use what they mean. "Pizza" matches a spa, "amusement park" matches a donut shop, and "hotel" matches a restaurant in a hotel.

(I tested this from India, so I'm leaving distance out of it. Every result reads about 2,700 km away, which isn't a fair test of "near me." None of the problems above depend on that: a donut shop outranking an amusement park isn't about proximity.)


2. What search is for

Most ENTERTAINER offers work like this: show a PIN at the table, done. No booking, no checkout. So search isn't selling anything. It just needs to get someone from "I want sushi nearby" to a place they trust, without wrong turns.

The brief limits this to search: "not personalization or organic discovery. It's for when users are usually looking for something specific." So everything here starts from a typed word or a tapped search term. Nothing is a feed, a recommendation or a browse surface.

1
Matches what you meant.

Not just what the words happen to contain.

2
Close enough to get to.

A result you can't reach isn't really a result.

3
Ready for the next step.

Search should tell members what they can do next: redeem, call ahead, or check availability where that's supported.


3. Before / after

The same real searches from the real app, run through the redesign. The differences are about matching and about what the start screen offers, not location. Nothing here depends on where I was sitting when I tested it.

A prefix match isn't the same as a meant match

Why "before" is wrong: every one of PIMS, Pickl, Pizza Pie Factory and Pizzolo starts with "pi," so the real app treats that as equally good evidence for all five. The actual pizza match has no edge over a drink called PIMS.
Why "after" is better: "pi" resolves to the Pizza category first, because it's a prefix of the word, not just a substring that happens to appear somewhere. A venue that merely starts with the same two letters doesn't get a seat next to it.

Before
ENTERTAINER autocomplete for the letters 'pi', showing PIMS, Pickl, The Pizza Pie Factory, Pizzolo and Pizza Hut as unrelated suggestions
After
Redesigned autocomplete for 'pi', showing Pizza as an understood category and Pizza Lab as a matching venue

A non-match ranked beside a real match isn't ranking

Why "before" is wrong: Niyama Spa and Sfumato aren't pizza, Italian, or even the same category of venue. They're in the list for "pizza" because nothing cut them, not because anything connected them to pizza.
Why "after" is better: "near me" is parsed and used to rank by proximity instead of being silently discarded, and anything that isn't actually a pizza match gets dropped from the list entirely. Not ranked lower. Removed. What's left is ranked by rating and proximity, signals that only matter once relevance is already settled.

Before
ENTERTAINER results for 'pizza near me' listing Dodo Pizza, Pizza Hut, then Niyama Spa and Sfumato restaurant
After
Redesigned results for 'pizza near me' showing only two nearby pizza places, ranked by rating, nothing else

Words need to mean something together

Why "before" is wrong: "Amusement park" is read as two loose words. "Park" matches business parks in autocomplete and a restaurant called Culinary Park in the results, and "amusement" is ignored. Krispy Kreme and Tim Hortons make the list with no visible link to either word.
Why "after" is better: "Amusement park" resolves to one attraction type, with a count, in autocomplete. The results hold only places tagged that way. With "near me," the one nearby match leads and the farther one sits in a collapsed "Further away" group instead of vanishing.

Before
ENTERTAINER results for 'amusement park near me' led by Dubai Crocodile Park, then Krispy Kreme, African + Eastern and Tim Hortons
After
Redesigned results for 'amusement park near me' showing Fun City, with a collapsed Further away group below
Before
ENTERTAINER autocomplete for 'amusement park' suggesting business parks
After
Redesigned autocomplete for 'amusement park' showing Amusement park as one understood type with 2 places

A category word is a requirement, not a hint

Why "before" is wrong: "Hotel in marina" returns restaurants and salons. Each one sits at an address that contains "Hotel" or "Marina," so the text matched, but none of them is a hotel. The search treats "hotel" as a string to find, not a category to honour.
Why "after" is better: "Hotel" sets the category and "marina" sets the place, before any matching runs. Only hotels in the Marina area remain, and the Dining and Attractions tabs show zero. Not ranked lower. Removed.

Before
ENTERTAINER results for 'hotel in marina' showing restaurants and salons
After
Redesigned results for 'hotel in marina' showing only Marina Bay Suites and The Walk Beach Hotel, with Hotels tab selected

A zero state should start searches, not host browsing

Why "before" is wrong: "What's Around You" is a row of venue tiles. That's a browse surface, not a search tool, and the brief rules it out. It also leaks test data ("TEST Outlet…", "Practice Usi…") into the first screen people see.
Why "after" is better: Three small things, and every one fills the search box. Recents stay, capped at three, because repeat lookups are the one history worth keeping. Category chips put Dining, Hotels and Attractions one tap away. Three example searches show the kind of sentence the search now understands. The venue tiles, location row and trending row are gone: typing a place already suggests it, and a short screen is faster to scan.

Before
ENTERTAINER's current search start page with Recent searches, Search by Location, What's Around You venue tiles and Trending
After
Redesigned search start page with three recent searches, three category chips and three example searches

4. What it looks like

Five screens, not a walkthrough. Every one of these is live in the prototype linked below, not a static mock.


5. How ranking works

No AI model here. Just rules I can point to and explain.

1
Understand first.

Pull out the cuisine, the place, "near you," from the words instead of quietly dropping them, then rank on what they mean.
How: the query is parsed into those parts before any matching runs, not after. A result is scored against what "pizza near me" means, not against the literal five characters.

2
Drop the weak matches.

Once something really matches, anything that only sort of matches gets cut. Not buried lower. Cut.
How: every result gets a relevance score. Anything under the cutoff is removed from the list outright, not ranked to the bottom. A spa never gets to row three.

3
What you meant beats distance.

Closer never beats more relevant. Distance only breaks a tie between two good matches.
How: distance only enters the sort after the relevance cutoff has already run. It breaks ties among survivors; it never decides who survives.

4
One card per merchant.

Three branches of the same place aren't three rows. The nearest one shows, the rest fold underneath.
How: outlets are grouped by merchant before ranking, not after. The nearest in-scope outlet represents the card; the rest collapse into "N more outlets."

5
A category word is a requirement.

"Hotel" means hotels. A restaurant that happens to sit inside one doesn't qualify.
How: when the query names a category, results from other categories are removed before ranking, so the other tabs read zero instead of padding the list.


6. The hard cases

These all came up while building this. The call I made on each, and whether it's actually running in the prototype.

1
No location permission.Built

Defaults to your city. Only asks for location when you type "near me."

2
Outside the home region.Same idea, built

Same fallback, same explainer banner. It just isn't wired to a real GPS in a prototype.

3
A merchant with 30 branches.Built

Shows 3, then "See all on map." Search "coffee" in the prototype. Common Grounds has nine.

4
Brand vs. cuisine.Built

"Pizza Hut" is a brand. "Pizza" is a cuisine. The search shows both. Try "pi" in the prototype.

5
Typos and Arabic.Partly built

Typos, yes. Try "hurricans gril" in the prototype. Arabic spelling needs a native speaker to get right, not a guess from me.

6
A merchant's offers ran out.Decided, not built

Still shows, just ranked lower, with a renewal date instead of a live offer.

7
Barely any matches nearby.Built

Never a blank screen. It says what's missing, then widens the search.

8
Offer excluded at one branch.Decided, not built

Rare enough to flag, not redesign around. That one branch just says so.

9
A restaurant inside a hotel.Built

The address says "Hotel," the merchant isn't one. Category comes from the merchant, never from address text. Try "hotel in marina" in the prototype.


7. Measuring it

There's no real data behind a take-home project. Here's what I'd watch once this actually shipped, and the targets I'd set going in. Every target is an assumption.

1
Search-to-redemption rate.North star

Target: +10% relative (assumption).
How: a PIN redemption within 24 hours of a search counts toward that search. It's slow to move, so the next two metrics tell us sooner.

2
First-tap success.

Top-3 result tapped. Target: ≥60% (assumption).
How: a tap followed by backing out within 10 seconds counts as a miss, not a success.

3
Re-search within 60 seconds.

Target: −20% (assumption).
How: only a reformulation of the same intent counts. Narrowing "hotel" to "hotel in marina" is healthy and doesn't.

4
Zero-result rate.Guardrail

Target: <3% (assumption). Time-to-first-tap must not regress.
Why: weak matches are dropped instead of buried, so empty results could rise, and fewer results must never make people slower.

5
Wrong-branch taps.Diagnostic

Opening "more outlets," then picking a different merchant entirely. It tests whether folding branches under one card works.

Every metric is split by query type (near-me, named place, category), because the redesign handles each differently.


8. The working prototype

Not a link out. This is the actual prototype, running right here, same as every screenshot above. Search "pizza near me," "hotel in marina" or "amusement park near me," or click a Try button on the left and watch it resolve.

Loading the interactive prototype…