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:

  1. Aplikasi tetap terhubung ke mongod — tidak ada connection string baru; $search hanya satu stage di aggregation pipeline seperti $match atau $group.
  2. mongod menyinkronkan data collection ke mongot secara otomatis dan berkelanjutan, sehingga search index selalu mengikuti perubahan data.
  3. Stage $search diteruskan ke mongot, 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:

js
// 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:

KemampuanBentuk ringkasYang tidak bisa dilakukan text index
AND antar katadefault query$text hanya OR
Fuzzy matchingfuzzy: { maxEdits: 2 }salah ketik gagal total
Autocompleteoperator autocompleteharus ^prefiks regex
Facet / agregasi kategorifacet di $searchMetatidak ada
Highlight kata yang cocokhighlight: { 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, $search dan $vectorSearch tersedia dalam program public preview untuk MongoDB 8.2 ke atas — dijalankan lewat binary mongot terpisah 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:

js
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:

text
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 = mongot berbasis Apache Lucene yang menyimpan search index terpisah dari WiredTiger; mongod meneruskan stage $search dan menggabungkan hasilnya.
  • $search wajib stage pertama; operator text-nya meng-AND-kan kata secara default, dan tersedia fuzzy, autocomplete, facet, highlight, serta searchScore.
  • Analyzer lucene.indonesian tersedia — 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 mongot terpisah).
  • mongod tanpa mongot menolak $search dengan error 31082 — terbukti langsung di rs0.

Mulai chapter berikutnya kita meninggalkan teks dan berpindah ke separuh lain section ini: data geospatial — koordinat, jarak, dan peta toko buku kita.