Membuat dan mengelola index dengan settings dan mapping, dynamic vs explicit mapping, index templates dan aliases, lalu operasi CRUD dokumen: index, get, update, delete, hingga bulk API, routing, dan versioning.

Di episode 3 Elasticsearch kalian sudah hidup. Sekarang kita mulai menggunakannya untuk hal yang paling mendasar: menyimpan data dan mengambilnya kembali. Konsep di episode ini — index, dokumen, CRUD, bulk — adalah bahasa sehari-hari yang akan kalian pakai di semua episode berikutnya, jadi pahami dengan baik. Episode 4 membahas dua wilayah: index management (membuat index dengan settings dan mapping, index templates, dan aliases) serta document operations (menambah, membaca, mengubah, dan menghapus dokumen, termasuk bulk API untuk batch dan konsep routing plus versioning).
Index dibuat dengan PUT dan nama lowercase. Secara default Elasticsearch meng-index semua field secara otomatis (dynamic mapping), tapi untuk kontrol penuh kita tentukan settings dan mapping secara eksplisit:
PUT /produk{
"settings": { "number_of_shards": 3, "number_of_replicas": 1, "refresh_interval": "1s" },
"mappings": {
"properties": { "name": { "type": "text" }, "price": { "type": "float" } }
}
}Di Dev Tools, format di atas langsung ditulis. Dengan curl, gabungkan dengan -X PUT -H 'Content-Type: application/json' -d '{...}'. Perhatikan number_of_shards: nilai ini tidak bisa diubah setelah index dibuat — kalian hanya bisa mengubahnya lewat reindex (episode 13).
Dynamic mapping membuat Elasticsearch menebak tipe data dari nilai pertama yang masuk: string menjadi text plus keyword, angka menjadi long/float, boolean menjadi boolean. Menebak ini praktis untuk prototyping, tapi berbahaya di production — satu angka seperti ID produk bisa salah diindeks sebagai long padahal seharusnya keyword. Karena itu, production selalu memakai explicit mapping, dan kita bisa mengatur kebijakan dynamic dengan "dynamic": "strict" untuk menolak field tak dikenal. Detail mapping dibahas menyeluruh di episode 5.
Template adalah "cetak biru" yang diterapkan otomatis ke index baru yang cocok dengan pola nama:
{
"index_patterns": ["logs-*"],
"template": {
"settings": { "number_of_shards": 2, "number_of_replicas": 1 },
"mappings": {
"properties": {
"@timestamp": { "type": "date" },
"level": { "type": "keyword" },
"message": { "type": "text" }
}
}
}
}Dengan template ini, setiap index baru bernama logs-... otomatis mendapat settings dan mapping yang konsisten — tanpa harus menuliskannya satu per satu. Ini fondasi dari index management as code (episode 28).
Alias adalah nama alternatif untuk satu atau lebih index. Ini memberi fleksibilitas besar: aplikasi selalu menunjuk ke alias, sementara index di baliknya bisa diganti tanpa mengubah kode — saat terjadi reindex (episode 13), alias membuat perpindahan ke index baru terasa instan bagi aplikasi:
POST /_aliases{
"actions": [
{ "add": { "index": "produk", "alias": "produk-search" } },
{ "remove": { "index": "produk", "alias": "produk-old" } }
]
}Menambah dokumen dilakukan dengan POST (biarkan Elasticsearch menentukan _id) atau PUT (tentukan _id sendiri):
PUT /produk/_doc/1{ "name": "Kaos Polos Premium", "price": 99000 }Responsnya berisi _id, _version (dimulai dari 1), dan result bernilai created. Menjalankan PUT yang sama lagi akan menimpa dokumen dengan result: updated dan _version: 2 — ini perilaku upsert.
GET /produk/_doc/1{
"_index": "produk",
"_id": "1",
"_version": 2,
"found": true,
"_source": { "name": "Kaos Polos Premium", "price": 99000 }
}Jika tidak ingin memuat seluruh _source (yang bisa besar), gunakan filter _source:
GET /produk/_doc/1?_source=nameUpdate mengubah hanya field yang diberikan tanpa menimpa seluruh dokumen:
POST /produk/_update/1{ "doc": { "price": 85000 } }Field lain tetap utuh, _version bertambah, dan result menjadi updated. Perhatikan: POST /produk/_update/1 adalah operasi scriptable — nanti di episode 13 kita pakai Update By Query untuk mengubah banyak dokumen sekaligus.
DELETE /produk/_doc/1DELETE /produkHati-hati dengan DELETE /produk — index dan semua datanya hilang permanen. Tidak ada tombol undo (kecuali snapshot, episode 20).
Mengirim request satu per satu itu boros — tiap request punya overhead HTTP. Bulk API memungkinkan kalian mengirim banyak operasi dalam satu request ke POST /produk/_bulk. Formatnya: dua baris per operasi — baris aksi (index/create/update/delete) dan baris data (kecuali delete):
{ "index": { "_id": "1" } }
{ "name": "Kaos Polos Premium", "price": 99000 }
{ "update": { "_id": "2" } }
{ "doc": { "price": 75000 } }Bulk adalah cara tercepat menulis data massal — kita akan menggunakannya untuk indexing performa tinggi di episode 19. Satu request bulk idealnya berisi beberapa ribu dokumen dengan total puluhan megabyte, dan setiap aksi independen: satu gagal tidak menghentikan yang lain.
Routing menentukan shard mana yang menampung dokumen. Secara default, Elasticsearch menghitung hash dari _id. Kalian bisa mengatur routing manual supaya dokumen dengan kategori yang sama (misalnya category: fashion) selalu jatuh di shard yang sama — bermanfaat untuk pencarian yang sering difilter berdasarkan kategori:
PUT /produk/_doc/3?routing=fashionDengan routing manual, pencarian bisa membatasi diri ke satu shard saja (GET /produk/_search?routing=fashion), mempercepat query yang sudah tahu kategori targetnya. Trade-off-nya: distribusi data jadi tidak merata jika routing-nya buruk.
Versioning adalah sistem optimistis lock Elasticsearch. Setiap dokumen punya _version yang bertambah tiap perubahan. Kalian bisa mengirim ?version= untuk mencegah penimpaan tak sengaja — jika versi yang dikirim tidak cocok, Elasticsearch menolak dengan status 409 Conflict. Ini menjaga operasi tulis paralel tetap aman.
Tip
Mulai sekarang biasakan pola kerja: template untuk konsistensi, alias untuk fleksibilitas, dan _id yang stabil untuk data yang di-update. Nama index yang baik memakai pola domain-tahun.mm.dd untuk data time-series (misal produk-logs-2026.08.03) — ini akan sangat membantu saat kita bahas data streams dan ILM di episode 10 dan 11.
Di episode 4 kalian menguasai pengelolaan index dan operasi dokumen: membuat index dengan settings dan mapping, memahami dynamic vs explicit mapping, memakai index templates dan aliases, lalu menjalankan CRUD lengkap — PUT untuk menambah/menimpa, GET untuk membaca, POST _update untuk mengubah sebagian, DELETE untuk menghapus — plus bulk API untuk batch, routing untuk mengontrol distribusi, dan versioning untuk mencegah konflik tulis.
Inti yang harus dibawa pulang:
number_of_shards tidak bisa diubah setelah index dibuat.PUT /_doc/1 bersifat upsert; POST _update hanya mengubah field yang disebut.Selanjutnya kita masuk lebih dalam ke lapisan yang menentukan bagaimana data kalian dicari: mapping dan data types. Di episode 5 kita bedah perbedaan text vs keyword, tipe numerik, date, boolean, objek dan nested, geo, IP, serta parameter-parameter mapping yang mengatur perilaku tiap field. Sampai jumpa!