Dua chapter sebelumnya menutup dengan pertanyaan yang sama: ke mana bila text index tidak cukup? Jawabannya adalah Atlas Search — search engine berbasis Apache Lucene yang menyatu dengan MongoDB dan diakses lewat satu stage aggregation bernama $search. Chapter ini membahas arsitektur di baliknya, kemampuan yang menutup semua celah text index, dan di mana fitur ini tersedia. Karena $search berjalan di infrastruktur terpisah dari mongod biasa, semua contoh query di sini bersifat ilustratif — kita tutup chapter dengan satu eksperimen nyata yang membuktikan mengapa.
Arsitektur: Index Terpisah dari Storage Engine #
Text index hidup di dalam WiredTiger bersama data collection — itulah sumber sebagian besar batasannya. Atlas Search memilih jalan lain: sebuah proses bernama mongot menjalankan Apache Lucene dan menyimpan search index di luar storage engine.
Alur kerjanya:
- Aplikasi tetap terhubung ke
mongod— tidak ada connection string baru;$searchhanya satu stage di aggregation pipeline seperti$matchatau$group. mongodmenyinkronkan data collection kemongotsecara otomatis dan berkelanjutan, sehingga search index selalu mengikuti perubahan data.- Stage
$searchditeruskan kemongot, yang memindai index Lucene dan mengembalikan document beserta skor relevansinya untuk digabungkan kembali ke pipeline.
Pemisahan ini menjelaskan dua hal sekaligus: beban pemindaian teks tidak menyentuh WiredTiger, dan mesin pencari boleh punya teknologi sendiri (tokenizer, scorer, struktur index Lucene) tanpa dibatasi format BSON.
Stage $search dan Bentuk Umumnya #
Query dasar $search memakai operator text dengan dua field wajib — query dan path:
// mdtest: skip
db.buku.aggregate([
{
$search: {
text: {
query: "pisang goreng",
path: "sinopsis"
}
}
}
])Dua hal langsung tampak berbeda dari $text. Pertama, path menentukan field yang dicari per query, bukan per index — tidak ada masalah “satu index untuk semua field” seperti text index. Kedua, kata-kata dalam query dihubungkan dengan AND secara default, bukan OR — query di atas hanya mengembalikan buku yang memuat pisang sekaligus goreng. Kemampuan lanjutannya semuanya pengembangan dari bentuk dasar ini:
| Kemampuan | Bentuk ringkas | Yang tidak bisa dilakukan text index |
|---|---|---|
| AND antar kata | default query | $text hanya OR |
| Fuzzy matching | fuzzy: { maxEdits: 2 } | salah ketik gagal total |
| Autocomplete | operator autocomplete | harus ^prefiks regex |
| Facet / agregasi kategori | facet di $searchMeta | tidak ada |
| Highlight kata yang cocok | highlight: { path } | tidak ada |
| Skor relevansi | {$meta: "searchScore"} | textScore sederhana |
Sama seperti $text di $match, stage $search harus menjadi stage pertama pipeline; setelahnya kita bebas melanjutkan dengan $match, $limit, $project, atau $lookup.
Ketersediaan Atlas dan Self-Managed #
Atlas Search lahir di MongoDB Atlas, tetapi sekarang jalur pemakaianya lebih dari satu. Fakta berikut perlu dibaca pelan-pelan karena tiap jalur punya syarat berbeda:
- Atlas: tersedia di semua cluster, termasuk cluster gratis untuk pengujian; untuk beban produksi MongoDB mengarahkan ke cluster dedicated M10 ke atas.
- Enterprise Advanced (self-managed): kemampuan search tersedia sebagai add-on berlangganan. Pengumuman resminya menempatkannya pada search nodes yang dikelola lewat MongoDB Controllers for Kubernetes, dengan Enterprise Server 8.0.10+ (operator 1.4) atau 8.2+ (operator 1.5+).
- Community Edition (self-managed): sejak pengumuman September 2025,
$searchdan$vectorSearchtersedia dalam program public preview untuk MongoDB 8.2 ke atas — dijalankan lewat binarymongotterpisah yang diunduh dari situs resmi, dengan peringatan eksplisit untuk keperluan evaluasi, bukan produksi.
Intinya: $search membutuhkan mongot — proses yang tidak ikut berjalan saat kita menyalakan mongod biasa. Kita bisa membuktikannya langsung di server lokal rs0 kita:
use latihan_geo
try {
db.buku.aggregate([ { $search: { text: { query: "samudra", path: "sinopsis" } } } ]).toArray()
} catch (e) {
print("Galat: " + e.code)
print(e.message)
}Output yang Dihasilkan:
switched to db latihan_geo
Galat: 31082
Using $search and $vectorSearch aggregation stages requires additional configuration. Please connect to Atlas or an AtlasCLI local deployment to enable.For more information on how to connect, see https://dochub.mongodb.org/core/atlas-cli-deploy-local-reqs.Server 9.0.2 kita mengenali stage $search, tetapi menolaknya dengan error 31082 karena tidak ada mongot yang terhubung. Pesan itu sekaligus menunjukkan dua jalan praktis untuk mencoba: membuat cluster gratis di Atlas, atau memakai Atlas CLI untuk menyiapkan local deployment lengkap dengan search di mesin sendiri.
Rangkuman #
- Atlas Search =
mongotberbasis Apache Lucene yang menyimpan search index terpisah dari WiredTiger;mongodmeneruskan stage$searchdan menggabungkan hasilnya. $searchwajib stage pertama; operatortext-nya meng-AND-kan kata secara default, dan tersedia fuzzy, autocomplete, facet, highlight, sertasearchScore.- Analyzer
lucene.indonesiantersedia — menutup kelemahan terbesar text index untuk konten kita. - Jalur pemakaian: Atlas (semua cluster), Enterprise Advanced add-on (Kubernetes, Server 8.0.10+), Community 8.2+ (public preview, binary
mongotterpisah). mongodtanpamongotmenolak$searchdengan error 31082 — terbukti langsung dirs0.
Mulai chapter berikutnya kita meninggalkan teks dan berpindah ke separuh lain section ini: data geospatial — koordinat, jarak, dan peta toko buku kita.