For an online marketplace, having millions of listings is useful only if buyers can find the right one.
At KupujemProdajem , Serbia's largest online classifieds marketplace, search is the primary way users discover ads. Buyers search from the web and mobile applications, while internal teams use search for moderation and support. Because of that, both relevance and latency directly affect user engagement and sellers' ability to be discovered.
Today, KupujemProdajem uses Manticore Search to search approximately 5.6 million active ads, while separate administrative indexes contain around 70 million rows of current and historical data. The production cluster handles around 150 search requests per second on average, with an average Manticore query time of approximately 10 ms.
And the same search infrastructure is now giving the team a path toward something more ambitious: hybrid lexical and semantic search designed specifically for Serbian-language marketplace content.
Search is part of the core product
KupujemProdajem maintains two main kinds of search indexes. The first powers the customer-facing experience. It contains approximately 5.6 million active classified ads, including titles, descriptions, categories, and structured attributes. Users search these indexes while browsing the marketplace on web and mobile.
The second set of indexes is used internally. In addition to current data, these indexes retain part of the history of deleted ads, allowing moderation and support teams to search information that may no longer be visible on the public marketplace.
This makes search important on both sides of the product. For buyers, it determines how quickly they can get from an idea of what they want to a relevant listing. For sellers, search affects whether their ads are discovered. Internally, it gives employees access to historical marketplace data when investigating problems.
As Dimitrije Marinković , Backend Developer at KupujemProdajem, puts it:
“Search is the primary discovery mechanism on the platform, so relevance and latency directly affect user engagement and seller success.”
Choosing a search engine that could grow with the product
KupujemProdajem had already been running a dedicated search engine for years. When its previous engine, Sphinx, stopped being actively developed, the team needed a maintained alternative that would fit the existing architecture without requiring the entire search integration to be rebuilt.
But compatibility was only part of the decision. The new engine also needed to support:
- consistently low query latency;
- real-time changes to millions of ads;
- replication ;
- SQL that worked naturally with the team's MySQL-centric PHP stack;
- full-text search together with structured filters ;
- flexible relevance tuning ;
- and a path toward vector and hybrid search .
Manticore provided those capabilities in one system. That last requirement is becoming increasingly important.
KupujemProdajem plans to combine traditional lexical search with vector search using its own embedding model . Because Manticore supports KNN search alongside full-text search, the team can build that functionality inside the search infrastructure it already operates instead of synchronizing its data with a separate vector database.
Keeping millions of changing ads searchable in real time
MySQL remains the source of truth for marketplace data. When an ad is created, edited, or removed, the corresponding change is pushed to Manticore in real time. The production workload averages approximately 40 REPLACE
operations per second, with additional UPDATE
and DELETE
operations.
This is particularly useful for classifieds. Marketplace inventory changes continuously. Sellers publish new ads, update prices and descriptions, change status, and remove products that are no longer available.
A search system therefore has two jobs at once:
- return relevant results quickly;
- make sure those results reflect the current marketplace.
KupujemProdajem uses Manticore's real-time updates to keep the searchable representation of the marketplace synchronized with MySQL as these changes happen.
More than matching words
Marketplace search also has very different requirements from searching a collection of plain documents. A listing contains text, but it also has structured information such as category, price, location, status, and other properties. KupujemProdajem combines full-text matching with filters over these typed attributes in Manticore.
The team also controls how different parts of the listing affect relevance. The title, for example, receives significantly more weight than the description or category. This makes intuitive sense for classified ads: a product named directly in the title is normally a stronger signal than the same word appearing somewhere in a longer description.
On top of this, KupujemProdajem uses a custom ranker tuned for its relevance requirements and groups results by ad. This gives the team the ability to encode marketplace-specific relevance rules rather than relying entirely on a generic ranking formula.
A small replicated cluster
The entire Manticore deployment runs on four virtual machines. Three nodes form the production replication cluster, while a fourth VM serves as a backup. All writes are sent to one node and replicated to the others. Read requests are distributed among all three production nodes by application-level logic.
The architecture is relatively simple: MySQL → real-time updates → Manticore write node → replicated Manticore nodes → web/mobile/admin search
That simplicity matters operationally. The team does not need a large distributed data platform merely to support marketplace search. The same cluster handles ingestion, full-text retrieval, structured filtering, custom ranking, replication, and the foundation for future vector search.
5.6 million active ads, 70 million admin rows
The user-facing indexes currently contain around 5.6 million active ads and occupy approximately 9 GB. The larger administrative indexes contain approximately 70 million rows, including some historical deleted-ad data, and occupy around 90 GB.
Across the three-node cluster, KupujemProdajem sees approximately:
| Metric | Production scale |
|---|---|
| Active ads | ~5.6 million |
| Admin index rows | ~70 million |
| User-facing index size | ~9 GB |
| Admin index size | ~90 GB |
| Search traffic | ~150 queries/sec average |
| Search traffic per node | ~50 queries/sec average |
REPLACE traffic | ~40/sec |
| Average query time | ~10 ms |
| Infrastructure | 3 production VMs + 1 backup |
The cluster remains stable under normal operation, without stuck or long-running queries. Short latency spikes of approximately 150 ms occur occasionally, while the average query execution time remains around 10 ms. Those numbers are particularly useful because this is not a synthetic benchmark. They describe an actual production workload behind the primary discovery experience of a large marketplace.
What users get from this architecture
Infrastructure metrics matter, but only because of what they enable at the product level. For buyers, Manticore helps KupujemProdajem keep search fast even while querying millions of listings and applying relevance logic and structured filters. Because changes are continuously pushed into the index, search can also reflect changes in marketplace inventory quickly instead of relying on occasional large reindexing jobs.
For sellers, this infrastructure supports the main mechanism through which buyers discover their listings. For moderation and support teams, the much larger internal indexes make historical ad information searchable even when it is no longer part of the live marketplace.
The next challenge: understanding Serbian-language intent
The next project for the KupujemProdajem team is hybrid search . Traditional full-text search works particularly well when the words entered by a user also appear in an ad. But marketplace users and sellers do not always describe the same thing in exactly the same way.
That problem becomes even more interesting in Serbian. The team highlights several challenges:
- rich morphology ;
- both Latin and Cyrillic scripts;
- synonyms ;
- different ways buyers and sellers can express the same intent.
KupujemProdajem is therefore preparing its own embedding model for Serbian marketplace content. The plan is to retrieve results using both lexical matching and KNN vector search, then combine the two sets of signals at query time.
The user benefit is straightforward. Someone may search for an item using words that never literally appear in the seller's listing, while the listing is nevertheless highly relevant. Semantic retrieval can provide another signal for recognizing that relationship.
As Dimitrije describes the expected result:
“Semantic matching will let users find relevant ads even when their wording doesn't literally match the listing.”
Perhaps just as important for the engineering team, they do not need to introduce another database to do it. The vector representation can live alongside the text and structured attributes already searchable in Manticore, giving the team one engine in which to combine lexical relevance, filters, and semantic similarity.
A foundation for better marketplace search
KupujemProdajem already uses Manticore for one of the most important workflows on its marketplace. Approximately 5.6 million active ads are searchable with an average engine query time of around 10 ms. Updates arrive continuously. Replication provides multiple search nodes. Internal teams search a much larger historical dataset using the same technology.
But the more interesting part may be what comes next. The team can now experiment with semantic retrieval and hybrid relevance without replacing the search infrastructure or operating an additional vector database.
For KupujemProdajem, that means Manticore is not only keeping today's marketplace search fast. It is also giving the team a practical way to make tomorrow's search better.

