Users come to the site, type a query... and nothing. Zero results. Or worse — hundreds of pages without filters. Standard MySQL search with LIKE '%query%' can't keep up with competition anymore. According to statistics, 70% of users leave a site if they don't find the desired product within the first 3 seconds. With LIKE search, response time grows linearly with database size: on 100,000 records it reaches 2-3 seconds. Typesense, however, processes queries in 15-50 ms, which is 200 times faster. We solve this problem by integrating Typesense — a search engine that responds in milliseconds and delivers relevant results even on corpuses of millions of documents. Switching to Typesense saves up to 60% of budget compared to Algolia, and the integration cost pays off in 3-6 months.
Why Typesense?
Typesense is written in C++ and positions itself as a self-hosted alternative to Algolia. Its key feature is a strict collection schema that guarantees data integrity and stable response time (consistently below 50 ms). Unlike Meilisearch, Typesense has built-in clustering via the Raft algorithm, support for vector search via HNSW, and geo-search out of the box. Typesense documentation claims that on a corpus of 10 million documents, average response time does not exceed 30 ms.
| Characteristic | Typesense | Meilisearch |
|---|---|---|
| Implementation language | C++ | Rust |
| Clustering | Built-in (Raft) | Absent in OSS |
| Vector search | Yes (HNSW) | Yes (since v1.6) |
| Geo-search | Yes, native | Yes |
| Query analytics | Built-in | Via third-party tools |
| Strict schema | Mandatory | Optional |
Typesense is two to three times faster than Meilisearch on queries with facets thanks to built-in analytics and more efficient indexing. Our integration experience confirms: after migrating from Elasticsearch, average response time dropped from 200 ms to 15 ms, and search accuracy reached 95%.
How we set up Typesense
The integration process includes 5 steps:
- Deployment — running Typesense in a Docker container with API key and port.
- Schema creation — defining collections with strict field types and facets.
- Indexing — writing a script to sync data from the database to Typesense in batches.
- Frontend component — developing a search bar with autocomplete, facets, and sorting.
- Fine-tuning — testing relevance, adjusting field weights and synonyms.
Deployment and collection creation
Typesense is easily deployed via Docker. Example docker-compose.yml:
# docker-compose.yml services: typesense: image: typesense/typesense:0.25.2 command: > --data-dir /data --api-key=${TYPESENSE_API_KEY} --listen-port=8108 --enable-cors volumes: - typesense_data:/data ports: - "8108:8108" After startup, we create a collection with a strict schema. We must specify field types and facet flag:
{ "name": "products", "fields": [ { "name": "id", "type": "string" }, { "name": "name", "type": "string" }, { "name": "description", "type": "string" }, { "name": "price", "type": "float", "facet": true }, { "name": "category", "type": "string", "facet": true }, { "name": "brand", "type": "string", "facet": true }, { "name": "in_stock", "type": "bool", "facet": true }, { "name": "rating", "type": "float", "optional": true }, { "name": "location", "type": "geopoint","optional": true } ], "default_sorting_field": "rating" } Data indexing
We write an indexer in PHP (or Python/Node — per client choice). It loads data from the database into Typesense in batches of 1000 documents. Each document must contain all schema fields. For upsert we use import with action 'upsert':
$documents = $products->map(fn($p) => [ 'id' => (string) $p->id, 'name' => $p->name, 'price' => (float) $p->price, 'category' => $p->category->slug, 'in_stock' => $p->stock > 0, ])->toArray(); $client->collections['products']->documents->import( $documents, ['action' => 'upsert'] ); Search with facets on the frontend
On the client side, we implement a search bar with autocomplete (suggestions) and filters by category, brand, price. Typesense returns facet aggregations that allow updating the result count for each filter without a second request.
$results = $client->collections['products']->documents->search([ 'q' => $query, 'query_by' => 'name,description,brand', 'query_by_weights' => '3,1,2', 'filter_by' => 'in_stock:true && price:[100..5000]', 'facet_by' => 'category,brand,price', 'max_facet_values' => 20, 'sort_by' => 'rating:desc', 'per_page' => 20, 'page' => 1, ]); How Typesense supports vector search
For semantic search, Typesense accepts embedding vectors. Embeddings are generated on the application side (OpenAI, Cohere), after which the vectors are passed to Typesense. Hybrid search (text + vector) is supported, allowing documents to be found by meaning, not just exact matches. This is especially useful for large product catalogs: for example, the query "inexpensive smartphone with a good camera" will return relevant models even if those words are not in the description.
Common integration mistakes
- Incorrect schema selection — if a field is not marked as facet, it cannot be used for filtering. Changing the schema after indexing starts is difficult (the collection must be recreated).
- Too many facet fields — the more facet fields, the slower writes. We recommend no more than 10.
- Ignoring analytics — Typesense stores query statistics for queries with no results. This data helps improve synonyms and stop words.
What's included in the work?
- Current search audit — analysis of queries, errors, relevance.
- Typesense deployment — Docker container on your server or cloud.
- Collection schema creation — tailored to your data structure.
- Indexer for synchronization — code in PHP/Node/Python with delta handling.
- Frontend search component — with autocomplete, facets, sorting, and geo-search (optional).
- Testing and relevance tuning — field weights, synonyms, stop words.
- Documentation and training — API and configuration description for your team.
- Result guarantee — we ensure response time under 50 ms and search accuracy up to 95%.
How long does integration take?
| Step | Time |
|---|---|
| Deployment, collection schema | 1 day |
| Indexer + synchronization | 2 days |
| Search with facets on frontend | 2–3 days |
| Vector search (optional) | 2 additional days |
| Tests, relevance | 1 day |
Standard integration without vector search takes 6–7 working days. The cost is calculated individually — contact us and we'll estimate your project.
Want to improve search on your site? Get in touch — we'll provide a free diagnostic and pilot indexing. Request a consultation right now.







