Search that finds the product even when it's misspelled
We deploy AgentSearch on Shopify, PrestaShop and custom stores and tune it with your customers' real searches. In production on more than 76,000 products.
The usual ways store search lets shoppers down
Nearly all of them come from the same place: the search box matches letters, while customers type the way they talk, in a hurry and with typos.
Typos, plurals and full sentences
We allow up to two typos per word and treat the last word as a prefix: "hing" already finds hinges while the shopper types. For queries like "something to help me sleep", we add stopwords for the store's language and, where needed, semantic search.
- One-way synonyms for misspellings
- Equivalent synonyms: fridge, refrigerator, cooler
Search by part number and reference
In spare parts, customers paste a code. If it exists, they get the products that carry it, even when it only appears in the title or as an equivalent. If it doesn't, a part with a similar code is never shown as buyable: it appears separately, as an approximate match.
- The exact code ranks first even when the query has more words
- Discontinued products link to their replacement
Facets that add up
Facets by brand, category or whatever attribute fits your catalog. Ticking one recounts the others, and the number a facet shows is the number you get when you click it.
- Multi-select or single-select depending on the facet
- "Washer", "washer" and "WASHER" count as a single option
Stock and price for the store being searched
If you sell through several stores, each shows its own stock and price. We read inventory every hour, and when an order comes in we deduct the units from the index within seconds.
- Price and publishing changes reflected within an hour
- One index for several stores plus the back office
BM25, embeddings and when each one pays off
AgentSearch runs on Typesense, an open-source search engine that keeps its index in memory. Every query goes through BM25 first, the classic algorithm that scores products by which words match and in which field: "Bosch" in the title counts for more than in the description. BM25 gets brands, models and part codes right, and it's fast. In the pilot it averaged 47 ms across 76,871 products.
The semantic side uses embeddings: every product and every query becomes a vector of 3,072 numbers, generated with Azure OpenAI's text-embedding-3-large model, and the nearest ones are returned. In a test on a spare-parts catalog, a Spanish query meaning "thing to clean the filter" went from 1 result to 101 once vectors were on. The cost is latency: computing the query vector pushes search to 200-350 ms.
That's why we don't configure every store the same way. Where people search by part number, the main list runs on BM25 and vectors are kept for rescuing zero-result searches and for similar products, because mixing them into the list threw off the facet counts. On a health and beauty catalog, where people type "something for a sore throat", vectors go into the main list and facet counts are worked out in a separate pass.
The metrics that tell you whether search is selling
Every search is logged with its results and latency, every click with the product's position, and add-to-carts and orders with the search they came from. That gives you these numbers:
| Metric | What it tells you | What we do with it |
|---|---|---|
| Zero-result rate (%) | Vocabulary your catalog doesn't cover, typos, or products you don't sell | Add synonyms, or pass requested products you don't stock to purchasing |
| Result CTR | Share of searches with at least one click | If it drops, the ranking isn't convincing: adjust weights or pin products |
| Click position | Whether people click the first result or scroll down to the twelfth | Clicks far down on a frequent query: a relevance problem |
| Search conversion | Orders that started with a click on the results, and their value | This is the number that justifies the search engine, or doesn't |
| Click without purchase | Queries with interest that don't end in a sale | Price, stock or the product page. Rarely the search engine's fault, but this is where it shows |
The service includes a daily email with the previous day's top 50 zero-result searches, the ones with fewer than 5 results and the ones clicked but not bought. Personal data is anonymized after 90 days.
For a sense of the starting point: at a spare-parts store we work with, the previous search engine returned nothing for 8.8% of searches in a month. Among the most frequent were one of their best-selling brands and a misspelling of the Spanish word for "grille".
From your catalog to live search
The engine is the quick part. What stretches a project is the data: duplicate codes, products without a brand, stock that doesn't add up.
We read your catalog
From the store, PIM or ERP, read-only
We index and tune
Field weights, synonyms and facets tested on real queries
We install the widget
With a theme backup taken first
We measure and fix
Using the daily list of zero-result searches
Common questions about store search
What's the difference between semantic search and keyword search?
Keyword search (BM25) scores products by the words they share with the query and the field where they appear; it's precise with brands and part codes. Semantic search compares vectors (embeddings) and finds related products even when they share no words. AgentSearch combines both and sets the balance per store.
Is this kind of search worth it for a small catalog?
Often it isn't. With a few hundred well-named products, Shopify's or PrestaShop's own search, or a plugin like Doofinder, is usually enough and cheaper. AgentSearch pays off with thousands of SKUs, technical part codes, several stores or data in an ERP.
How do I know whether search is driving sales?
Through search conversion: orders that started with a click on the results. On Shopify the widget stores the search in the cart attributes and the orders webhook picks it up, with a one-hour window from the last click. On PrestaShop it's matched against orders in the store's database.
What happens if the AI fails or costs spike?
Search doesn't depend on it. If Azure OpenAI doesn't respond, the query is answered with BM25 and the shopper sees no error. Spending has a configurable daily cap: once it's hit, calls to the language model stop until the next day and we get an email alert.
Does it work in several languages?
Yes. On a Shopify store using Markets across several languages, we index each product's translated title and the widget picks up the language from the domain. Synonyms are set per market: "climatiseur mobile" in French went from 3 irrelevant results to 104.
Try it with your own catalog
Tell us your platform, how many products you have and which searches are failing. We'll build the demo with your products.