Building Zomato Search 2.0 (1/2)
May 1st, 2017: Recently started looking at overall Content Tech at Zomato which includes ‘Search’ as one of the components. After all, no amount of legwork to get the best and freshest possible is worthwhile if you can’t surface it properly.
This is a blog on how we attempt to make search more meaningful and useful to Zomato consumers.
Divide and Conquer (End of Week 1)
Used the first week to understand the lay of the land and break things down into smaller understandable units.
As the first step, we divided search into two parts — 1. Query Parsing & 2. Search Relevance/Ranking.
Both of these are critical steps in creating a seamless and meaningful search experience for our consumers. Parsing means to understand queries better and once I understand them better, I can showcase high-quality results. Let me give you an example here:
Lets’ say a user searches for “Chinese” on Zomato. A simple query like this could mean following possible context:
- Chinese Mall — which is location
- Chinese — Cuisine
- Chinese Chopsuey or Chinese Noodles — which are both dishes
- Chinese Inn or Supreme Chines — which are restaurants
Or Let’s say a user searches for “Greater Kailash”. This query could have following possible context:
- Greater Kailash 1 — which is a location
- Greater Kailash 2 — which is another location
- Kailash restaurant
Successfully resolving the above context will help us narrow down the users’ preference and showcase him high-quality well-clustered results. We found that Click Through Rate (CTR) for queries where we successfully understood the context was 2X of queries where we couldn’t really understand the content and ran a dirty query search.
Here’s an example of our inability to resolve context:
User searches for ‘Sector 29’ which is a very famous location with over 100 pubs and restaurants. However, there are multiple sector 29s — one each in Gurgaon, Noida and Faridabad. Thus, we have not been able to understand the context completely.
Thus, you can see results like — ‘Sector 55 China Town’ because ‘Sector’ was word match. Cafe 29 came in because 29 was a word match.. and so on. Thus fixing this was out top priority.
Context Resolution Engine (Week 2)
As the first step, we wanted to understand the user context better and thus we set out to build our context resolution engine. Here’s how we went about it:
Goal: For each search query on Zomato, find the closest possible context — location, group, dish, cuisine, chain, restaurant etc. with a high degree of confidence.
Scope: Scope of this was to just determine the context and not find the best answer out of the context. For e.g. ‘Sector 29’ query should result in context location with at least 80% confidence. Whether it is Sector 29 of Gurgaon or Faridabad is beyond the scope. However, some queries like ‘Chinese’ will get resolved into cuisine and become completely parsed because there are no children of Chinese cuisine.
Logic: We used a combination of Query match (exact match, word match, edge match, Levenshtein etc) and the number of restaurants within the context to resolve query into one of the contexts. We normalized the scores across contexts to build confidence levels. Any query where we have more than x% confidence in one particular context, we chose that to be default context.
Here’s how the %parsed queries jumped for Delhi with the new algo:
We recorded a 25% increase from our previous levels. This was a considerable improvement.
Here’s how the new page for search ‘Sector 29’ looks today:
Trending Searches — Get user tapping and not searching (Week 3)
We were keen on surfacing relevant search suggestions so that users don’t have to type what they are looking for. So in parallel, we developed ‘Trending Search’ to showcase popular searches in each locality. Here’s how the feature looks like:
Initial results from these have been really encouraging and we will be rolling them out to more markets across all our platforms.
We know there is plenty more to do. Do send across your feedback and suggestions.