Elasticsearch vs Meilisearch vs Typesense
Tiga search engine saya jalankan paralel 22 bulan di SaaS B2B + BUMN Jakarta. Elasticsearch untuk security log forensic + analytics. Meilisearch / Typesense untuk product search end-user latency-critical. Verdict per workload.
TL;DR
- Elasticsearch / OpenSearch: log forensic + business analytics + query DSL kompleks. Cost tinggi, ops complex.
- Meilisearch: product search end-user, relevance default bagus, footprint kecil. Saving cost vs ES untuk search workload.
- Typesense: similar Meilisearch + cluster HA mature, multi-tenant first-class.
- Verdict: Conditional — ES untuk analytical, Meilisearch / Typesense untuk end-user search. Jangan campur.
Konteks
Saya jalankan ketiga search engine paralel 22 bulan (Agustus 2024 - Mei 2026) di:
- Fintech series-B Jakarta: Elasticsearch self-host 3-node cluster untuk security log forensic + audit query, Meilisearch single-node untuk in-app search (find customer, find transaction, find document)
- BUMN energy Jakarta: Elasticsearch + Logstash + Kibana (ELK) stack untuk operational + security log, evaluasi Typesense untuk knowledge base search 4 bulan
Pengalaman ES sebelumnya: 7 tahun (sejak 5.x era). Meilisearch: 2 tahun. Typesense: 1 tahun.
Pricing (Juni 2026)
Elasticsearch self-host
- Software gratis (Elastic License 2.0 — free for production, no SaaS-of-software clause)
- 3-node cluster GKE Jakarta n2-standard-4 (4 vCPU, 16GB RAM, 1TB SSD per node):
- Compute: 3 × Rp 1,6 juta = Rp 4,8 juta/bulan
- Storage SSD 3TB: Rp 1,8 juta/bulan
- Cross-zone replication: Rp 400 ribu/bulan
- Plus Kibana 1 pod e2-medium: Rp 700 ribu/bulan
- Plus Logstash 2 worker: Rp 1,2 juta/bulan
- Total ES self-host: Rp 8,9 juta/bulan + ops 30-40 jam/bulan
Elastic Cloud managed
- Standard tier setara: USD 850/bulan = Rp 13,6 juta
- Gold: USD 1.500/bulan = Rp 24 juta
- Enterprise: USD 3.000+/bulan
OpenSearch Service AWS
- Setara t3.medium.search × 3: USD 750-1.300/bulan
- Tidak ada region Jakarta — terdekat Singapore (latency 30-50ms)
Meilisearch self-host
- Software gratis (MIT)
- Single-node e2-medium (2 vCPU, 4GB RAM) + 200GB SSD: Rp 920 ribu/bulan
- Untuk fintech saya: 1 cluster 3-node HA: Rp 2,8 juta/bulan
- Meilisearch Cloud (managed): USD 35-499/bulan tergantung tier
Typesense self-host
- Software gratis (GPL)
- 3-node cluster e2-small: Rp 1,4 juta/bulan
- Typesense Cloud: USD 36-500+/bulan
Algolia (managed, sebagai pembanding)
- Build plan: free 10k record, 10k search/bulan
- Grow plan: USD 0,5/1k search, USD 1/100 record
- Untuk 5 juta search/bulan + 500k record: USD 2.500-4.000/bulan = Rp 40-64 juta/bulan
Total search stack
| Komponen | Cost/bulan fintech |
|---|---|
| Elasticsearch self-host (log + audit) | Rp 8,9 juta |
| Meilisearch self-host HA (in-app search) | Rp 2,8 juta |
| Total | Rp 11,7 juta/bulan |
Bandingkan kalau full managed (Elastic Cloud + Algolia): Rp 70-90 juta/bulan equivalent. Self-host saves Rp 60+ juta/bulan dengan trade-off ops overhead 40-60 jam/bulan.
SLO + performance (22 bulan)
Elasticsearch
| Metrik | Target | Realisasi |
|---|---|---|
| Indexing latency p99 | < 500ms | 320ms |
| Search latency simple query p99 | < 200ms | 145ms |
| Search latency aggregation p99 | < 2 detik | 1,4 detik |
| Throughput indexing | > 5k doc/s | 12k doc/s sustained |
| Throughput search | > 200 query/s | 850 query/s peak |
| Cluster availability | 99,9% | 99,87% |
Insiden ES 22 bulan: 4 P2 (memory pressure 2x, disk fill 1x, deploy regression 1x). 0 P0.
Meilisearch
| Metrik | Target | Realisasi |
|---|---|---|
| Search latency p99 | < 50ms | 22ms |
| Indexing latency p99 (per document) | < 100ms | 65ms |
| Throughput search | > 1k query/s | 4.500 query/s peak |
| Cluster availability | 99,9% | 99,95% |
Meilisearch sangat snappy untuk end-user search. Default tuning sudah bagus, minimal effort untuk hit SLO.
Typesense (eval 4 bulan)
| Metrik | Realisasi |
|---|---|
| Search latency p99 | 28ms |
| Indexing latency p99 | 78ms |
| Throughput search | 3.800 query/s peak |
| Cluster HA failover | 8 detik (lebih cepat dari Meilisearch HA) |
Typesense HA cluster more mature dibanding Meilisearch. Untuk multi-tenant scenario (per-customer index), Typesense API design lebih clean.
Capability comparison
| Capability | Elasticsearch | Meilisearch | Typesense |
|---|---|---|---|
| Full-text search | ya (powerful) | ya (typo-tolerant default) | ya (typo-tolerant) |
| Faceted search | ya | ya | ya |
| Geo search | ya (geo_point, geo_shape) | ya (basic) | ya |
| Aggregation kompleks | ya (best) | terbatas | terbatas |
| Time-series optimization | ya (ILM, data stream) | tidak | tidak |
| Percolation (reverse search) | ya | tidak | tidak |
| Vector / semantic search | ya (dense_vector 8.x+) | ya (8.x+) | ya (1.x+) |
| Multi-language analyzer | ya (50+ language) | ya (10+ language) | ya |
| Bahasa Indonesia tokenizer | ya (custom analyzer) | basic | basic |
| Realtime indexing | hampir realtime (1 detik refresh) | realtime | realtime |
| Cluster HA | mature | maturing | mature |
| Multi-tenant | manual (separate index) | manual | first-class API |
| Query DSL | JSON, kompleks | simpler | simpler |
| Ekosistem (Kibana, Logstash) | mature | terbatas | terbatas |
| Self-host operational complexity | tinggi | rendah | rendah |
| Memory footprint per node | 16-32GB typical | 1-4GB | 1-4GB |
Search relevance comparison
Workload: search 380k customer record di SaaS B2B (nama, email, NPWP, alamat).
| Aspek | Elasticsearch default | Meilisearch default | Typesense default |
|---|---|---|---|
| Setup time | 2-3 hari (analyzer + mapping) | 30 menit | 45 menit |
| Typo tolerance default | manual (fuzzy query) | otomatis | otomatis |
| Bahasa Indonesia stem | manual (custom analyzer) | basic | basic |
| Relevance default kualitas | OK (need tuning) | excellent | excellent |
| Tuning effort | tinggi | rendah | rendah |
Untuk product search end-user dengan query bersifat fuzzy / typo-tolerant: Meilisearch + Typesense default-nya lebih bagus dari ES default. ES bisa mencapai relevance same atau better, tapi butuh tuning analyzer + scoring 1-2 minggu.
Trade-off arsitektural
Pilih Elasticsearch / OpenSearch kalau:
- Log analytics / SIEM (security forensic, audit)
- Aggregation kompleks (timeseries, bucket aggregation)
- Volume document > 100M atau retention panjang
- Integrasi ekosistem (Kibana visualization, Logstash pipeline, Filebeat shipper)
- Vector search dengan dataset besar (8.x+ KNN)
- Query DSL kompleks dibutuhkan
Pilih Meilisearch kalau:
- End-user product search
- Latency p99 < 50ms wajib
- Dataset menengah (1M-50M document)
- Relevance default bagus tanpa banyak tuning
- Self-host operational simple
Pilih Typesense kalau:
- Multi-tenant SaaS (per-customer index)
- Cluster HA matang (lebih dari Meilisearch saat ini)
- Similar Meilisearch fitness
- Real-time indexing wajib
Pilih Algolia managed kalau:
- E-commerce dengan revenue dependent search relevance
- Butuh advanced feature (personalization, A/B test, Insights API, AI ranking)
- Budget premium OK (Rp 40-100 juta/bulan acceptable)
- SLA 99,99% kontraktual penting
HA + DR
Elasticsearch HA
- 3-node cluster minimum (master quorum)
- Replica shard = 2 (1 primary + 2 replica)
- Cross-zone distribution (asia-southeast2-a, b, c)
- RPO: 5 detik (refresh interval default 1 detik)
- RTO: 30-60 detik untuk replica promotion saat primary fail
- Snapshot to R2 daily, retention 30 hari hot + 7 tahun Glacier
Meilisearch HA
- HA via cluster mode (di v1.x stable)
- 3-node cluster: 1 leader + 2 follower
- RPO: ~1 detik
- RTO: ~10-15 detik failover
Typesense HA
- 3-node Raft cluster
- RPO: 0 (synchronous)
- RTO: 5-10 detik
- Lebih mature HA story dari Meilisearch saat ini
Pattern indexing
Elasticsearch indexing pipeline
Service log ──→ Filebeat ──→ Logstash (transform) ──→ ES bulk API
│
├─ retention policy ILM (hot → warm → cold → delete)
├─ index lifecycle 30 hari hot + 90 hari warm
└─ snapshot ke R2 weekly
Tuning produksi:
- Bulk batch 1000-5000 doc / request
- Refresh interval 5-10 detik untuk write-heavy index
- Replica 1 untuk write-heavy, 2 untuk read-heavy
Meilisearch indexing pipeline
Domain database (Postgres) ──→ CDC trigger ──→ Meilisearch document API
(batch 100-1000 doc)
Saya pakai CDC dengan Debezium → Kafka → consumer push ke Meilisearch. Latency Postgres-to-search: 2-5 detik typical.
Typesense indexing pipeline
Similar Meilisearch. API multi-tenant first-class — 1 collection per customer untuk SaaS.
Common pitfall
- ES heap size salah. Default 1GB tidak cukup untuk production. Set 50% RAM up to 31GB (compressed oops boundary). 32GB+ = wasted memory.
- ES query tanpa pagination limit. Query return millions of doc = OOM. Setup search.max_buckets + max_result_window limit. Pakai search_after untuk deep pagination.
- Meilisearch index lock. Bulk update masuk semua = lock index. Batch update dengan size 1000-5000 + interval, jangan flood.
- Multi-tenant tanpa per-tenant rate limit. Customer enterprise heavy load = degrade tenant lain. Implement quota per-tenant + circuit breaker.
- Relevance tidak pernah di-tune untuk Bahasa Indonesia. Default analyzer ES = English. Untuk Bahasa Indonesia: custom analyzer dengan stop word + stemmer Sastrawi (Indonesian-specific). Effort 1-2 minggu, impact relevance signifikan.
Indonesia specific
Tokenizer Bahasa Indonesia
ES: pakai Sastrawi via custom analyzer + sebagai filter token. Setup:
{
"settings": {
"analysis": {
"analyzer": {
"indonesian_stemmer": {
"tokenizer": "standard",
"filter": ["lowercase", "indonesian_stem"]
}
},
"filter": {
"indonesian_stem": {
"type": "stemmer",
"name": "indonesian"
}
}
}
}
}
Plus stop word list Indonesia (yang, dan, atau, dll). Improve recall 25-35% untuk search Bahasa Indonesia.
Meilisearch: support stop word + synonyms manual. Tokenizer basic, tapi untuk SaaS B2B dengan nama customer + produk relatif simple, default cukup.
Data residency
Self-host ES + Meilisearch di GKE Jakarta = data tinggal di Indonesia. Untuk fintech regulated: wajib. Algolia / Elastic Cloud Singapore region: data keluar Indonesia, perlu disclosure untuk customer.
Hiring
ES engineer di Jakarta: pool moderate. CKS / Elastic Certified Engineer ada beberapa, kompensasi Rp 30-45 juta/bulan untuk senior. Meilisearch / Typesense engineer scarce — train dari ES engineer atau backend engineer (ramp-up 2-3 minggu).
Cost of ownership 36 bulan
Skenario: SaaS B2B + fintech series-B, log + search workload mixed.
| Item | Self-host ES + Meilisearch | Elastic Cloud + Algolia | OpenSearch Service + Typesense Cloud |
|---|---|---|---|
| License/SaaS 3 tahun | Rp 0 | Rp 2,7 miliar | Rp 1,2 miliar |
| Infra | Rp 425 juta | Rp 0 | Rp 0 |
| Ops engineer | Rp 540 juta | Rp 95 juta | Rp 130 juta |
| Migration | Rp 60 juta | Rp 40 juta | Rp 50 juta |
| Total 3 tahun | Rp 1,03 miliar | Rp 2,84 miliar | Rp 1,38 miliar |
Self-host paling murah cash, tapi ops effort 540 juta = ~1,5 FTE engineer 3 tahun. Untuk fintech series-B saya, justify ada 1 SRE dedicated search.
Yang surprising
Setelah 22 bulan: Meilisearch tooling sangat mature untuk skala mid-market. Saya start dengan ekspektasi “akan perlu migrate ke ES untuk scale”, tapi 4 juta document + 850 query/s peak masih comfortable di Meilisearch. Threshold migrate ke ES bukan volume — tapi feature (aggregation kompleks, time-series, vector dense).
Surprise lain: Bahasa Indonesia analyzer di ES setelah saya tune dengan Sastrawi ternyata improve search precision (relevance) lebih signifikan dari ekspektasi. Customer support feedback: pencarian customer name dengan typo / ejaan beda sekarang 90%+ hit rate, sebelumnya 65-70%. Worth 2 minggu effort tuning analyzer.
Verdict
Conditional dengan rule konkret:
- Log analytics + security forensic + analytical aggregation: Elasticsearch / OpenSearch self-host atau managed. Default enterprise.
- End-user product search latency-critical: Meilisearch / Typesense self-host. Default SaaS / e-commerce modern.
- E-commerce dengan revenue depend on search: Algolia. Worth premium untuk personalization + advanced ranking.
- Skip campur workload — jangan pakai 1 tool untuk semua. ES bukan untuk search end-user, Meilisearch bukan untuk log analytics.
Threshold konkret transisi self-host ke managed: tim SRE < 0,5 FTE atau ops cost time > Rp 30 juta/bulan. Di atas threshold ini, managed makes economic sense.
Ditulis oleh Asti Larasati