Memahami inverted index, scoring BM25, arsitektur cluster/shard/replica Elasticsearch, real-time indexing pipeline, serta praktik setup Docker dan full-text search query dengan highlighting untuk product search

Setelah di episode 8 kita memahami object storage dan CDN untuk file serving, pada episode ini kita masuk ke komponen yang menangani salah satu fitur paling penting dalam user experience: full-text search. Ketika user mengetik "laptop murah" di search bar, mereka mengharapkan hasil yang relevan dalam hitungan milidetik — bukan sekadar pencarian exact match.
Database relasional bisa melakukan pencarian dengan LIKE '%keyword%', tapi pendekatan ini sangat lambat (full table scan) dan tidak mendukung fitur seperti fuzzy matching, synonym, atau relevance scoring. Elasticsearch dirancang khusus untuk solve masalah ini — dan menjadi standar de facto untuk search di production.
Inverted index adalah struktur data yang memetakan setiap term ke dokumen yang mengandung term tersebut.
Term → Document IDs
"laptop" → [doc1, doc3, doc7]
"asus" → [doc1, doc5]
"murah" → [doc3, doc7]
"laptop asus" → [doc1] (phrase match)Dibanding SQL LIKE '%laptop%' yang scan seluruh table, inverted index langsung tahu dokumen mana yang mengandung "laptop" — lookup O(1) per term.
BM25 (Best Matching 25) adalah algoritma scoring yang digunakan Elasticsearch untuk menentukan relevansi dokumen terhadap query.
Faktor yang mempengaruhi skor:
Analyzer memproses text menjadi terms yang di-index:
Input: "Laptop ASUS VivoBook 15"
→ Char filter: "laptop asus vivobook 15"
→ Tokenizer: ["laptop", "asus", "vivobook", "15"]
→ Token filter: ["laptop", "asus", "vivobook", "15"] (lowercase, remove stopwords)Built-in analyzers: standard (default), simple, whitespace, keyword. Custom analyzer untuk bahasa Indonesia: gunakan indonesian analyzer dengan stemming.
Cluster (production-cluster)
├── Node 1 (master-eligible)
├── Node 2 (data)
├── Node 3 (data)
└── Index: products (5 shards, 1 replica)
├── Shard 0 (primary) → Node 1
├── Shard 0 (replica) → Node 2
├── Shard 1 (primary) → Node 2
├── Shard 1 (replica) → Node 3
└── ...| Komponen | Penjelasan |
|---|---|
| Cluster | Kumpulan node yang tergabung |
| Node | Satu instance Elasticsearch |
| Index | Kumpulan dokumen (analog table di SQL) |
| Shard | Sub-divisi index untuk paralelisasi |
| Replica | Copy shard untuk redundancy dan read scaling |
Hot phase: → Index aktif, write/read tinggi
Warm phase: → Index tidak aktif tapi masih bisa di-search
Cold phase: → Index jarang diakses, compressed
Delete: → Hapus index (retention policy)Near real-time: dokumen tersedia untuk search ~1 detik setelah index (bukan instant, tapi sangat cepat).
{
"name": "Laptop ASUS VivoBook 15",
"description": "Laptop ringan untuk produktivitas sehari-hari",
"price": 8500000,
"category": "electronics",
"tags": ["laptop", "asus", "vivobook"]
}Mapping mendefinisikan bagaimana field di-index:
{
"mappings": {
"properties": {
"name": { "type": "text", "analyzer": "standard" },
"description": { "type": "text", "analyzer": "standard" },
"price": { "type": "integer" },
"category": { "type": "keyword" },
"tags": { "type": "keyword" }
}
}
}text untuk full-text search (di-analyze); keyword untuk exact match dan aggregations.
{
"query": {
"match": {
"name": {
"query": "lap",
"fuzziness": "AUTO"
}
}
},
"highlight": {
"fields": {
"name": {}
}
}
}{
"query": {
"bool": {
"must": [
{ "match": { "name": "laptop murah" } }
],
"filter": [
{ "range": { "price": { "lte": 10000000 } } }
]
}
},
"highlight": {
"fields": {
"name": { "pre_tags": ["<mark>"], "post_tags": ["</mark>"] }
}
}
}Elasticsearch juga digunakan untuk log search:
Tip
Untuk product search, gunakan bool query dengan must untuk relevance dan filter untuk exact constraints (price range, category). Filter tidak mempengaruhi scoring — hanya membatasi results. Ini menghasilkan search yang cepat dan relevan.
Inti yang harus dibawa pulang:
LIKE.text untuk search, keyword untuk exact match.Di episode 10 selanjutnya kita akan membahas CAP theorem & consistency models lanjut — PACELC, strong/eventual/causal consistency, dan trade-off yang muncul saat leader down. Kita akan melihat bagaimana consistency models mempengaruhi pilihan database dan replication strategy!