Menemukan data dengan kata kunci: membuat text index dan menjalankan query $text dengan scoring relevansi, lalu mengenal MongoDB Atlas Search berbasis Apache Lucene untuk fuzzy search, autocomplete, dan faceted search dengan scoring yang dapat disesuaikan.

Regex { title: /mongodb/i } memang bisa mencari kata, tapi untuk aplikasi pencarian yang serius — artikel, produk, dokumen legal — itu tidak cukup. Kalian butuh pencarian yang memahami token, mengabaikan kata tidak penting, memberi peringkat relevansi, dan bisa toleran terhadap typo. Inilah pekerjaan full-text search.
Episode 11 membahas dua tingkatan kemampuan pencarian MongoDB. Pertama, text index + query $text — fitur native yang ada di semua deployment MongoDB. Kedua, MongoDB Atlas Search — mesin pencarian berbasis Apache Lucene yang hanya tersedia di Atlas (SaaS). Roadmap-nya: text index, query $text, text score ranking, lalu pengenalan Atlas Search dengan fuzzy, autocomplete, dan faceted search. Mari mulai.
Sebelum bisa mencari teks, kalian harus membuat text index pada field yang ingin dicari. Berbeda dengan index biasa, text index memproses teks menjadi token (kata), mengabaikan stop words, dan menghitung relevansi:
db.articles.createIndex({ title: "text", content: "text" })Kalian bisa mencakup beberapa field sekaligus. Untuk memberikan bobot berbeda — misal judul lebih penting daripada isi — gunakan opsi weights:
db.articles.createIndex(
{ title: "text", content: "text" },
{ weights: { title: 10, content: 1 } }
)Dengan bobot di atas, kecocokan di judul dinilai 10 kali lebih relevan daripada kecocokan di isi — hasil pencarian "mongodb tutorial" akan mengutamakan artikel yang judulnya memuat kedua kata itu.
Setelah index ada, cari dengan operator $text:
db.articles.find({ $text: { $search: "mongodb tutorial" } })MongoDB memecah string pencarian menjadi kata-kata, lalu menemukan artikel yang memuat kata-kata tersebut. Query ini membutuhkan text index — tanpa index, MongoDB mengembalikan error.
Untuk pencarian yang lebih presisi, $text mendukung sintaks tambahan:
$search: "\"mongodb aggregation\"" — dua kata sebagai frasa utuh.$search: "mongodb -sql" — artikel dengan kata sql dikecualikan.$search: "\"mongodb\" \"pipeline\"" — kedua kata harus ada.db.articles.find({ $text: { $search: "\"mongodb aggregation\" -sql" } })Hasil $text secara default tidak terurut oleh relevansi. Untuk mengurutkannya, gunakan meta projection textScore:
db.articles.find(
{ $text: { $search: "mongodb tutorial" } },
{ score: { $meta: "textScore" } }
).sort({ score: { $meta: "textScore" } })Pola ini memproyeksikan skor relevansi ke field score, lalu mengurutkan berdasarkan skor tersebut. Hasilnya: artikel yang paling relevan (kata lebih sering, bobot lebih tinggi, dokumen lebih pendek) tampil paling atas — inilah pengalaman pencarian yang kalian harapkan dari aplikasi modern.
Text index native hebat untuk pencarian dasar, tapi punya batas yang membuatnya kurang cocok untuk aplikasi pencarian kelas enterprise:
Untuk kebutuhan ini, MongoDB menyediakan Atlas Search.
Atlas Search adalah mesin pencarian penuh yang tertanam di MongoDB Atlas, dibangun di atas Apache Lucene — mesin pencarian yang sama yang mendukung Elasticsearch. Atlas Search mengindeks data ke struktur inverted index khusus, lalu diakses lewat aggregation stage $search. Karena berjalan di dalam database, tidak ada sinkronisasi ke sistem terpisah — data selalu up-to-date.
Contoh pencarian dasar dengan $search:
db.articles.aggregate([
{ $search: {
index: "default",
text: {
query: "mongodb tutorial",
path: ["title", "content"]
}
} }
])Perhatikan strukturnya: index yang dipakai, operator pencarian (text), query, dan path field. Untuk hasil yang relevan, gabungkan dengan $sort menggunakan skor:
db.articles.aggregate([
{ $search: {
index: "default",
text: { query: "mongodb tutorial", path: "content" }
} },
{ $sort: { score: { $meta: "searchScore" } } }
])Fuzzy search membuat pencarian toleran terhadap typo dan salah eja — fitur yang tidak dimiliki text index native. Aktifkan dengan opsi fuzzy:
db.articles.aggregate([
{ $search: {
index: "default",
text: {
query: "mongdo",
path: "title",
fuzzy: { maxEdits: 1 }
}
} }
])Dengan maxEdits: 1, pencarian "mongdo" tetap menemukan dokumen dengan kata "mongodb" — koreksi otomatis typo satu huruf.
Fitur suggestion saat mengetik dibuat dengan operator autocomplete:
db.products.aggregate([
{ $search: {
index: "default",
autocomplete: {
query: "lat",
path: "name"
}
} }
])Saat user mengetik "lat", query ini langsung menyarankan produk seperti "Laptop Gaming" dan "Laptop Stand" — fondasi search bar dengan suggestion real-time.
Faceted search memungkinkan filter sekaligus dengan pencarian — misal menampilkan hasil produk "laptop" dengan filter kategori dan rentang harga dalam satu query. Dan karena berbasis Lucene, skor relevansi bisa disesuaikan dengan compound operator untuk menggabungkan beberapa kondisi berbobot.
Info
Ringkasnya: text index native gratis di semua deployment dan cukup untuk pencarian dasar; Atlas Search adalah pilihan saat aplikasi butuh fuzzy search, autocomplete, sinonim, atau faceted search. Jika aplikasi kalian belum menggunakan Atlas (self-hosted), text index adalah teman terbaik kalian — sementara alternatif eksternal seperti Elasticsearch atau OpenSearch bisa dipakai untuk kebutuhan pencarian raksasa, dengan trade-off harus sinkronisasi data keluar dari MongoDB.
Warning
Ingat aturan penting: query $text menolak bekerja tanpa text index, dan MongoDB hanya mengizinkan satu text index per collection. Rencanakan field apa saja yang perlu dicari sejak awal desain schema. Sementara itu, atlas search memerlukan index terpisah di sisi Atlas yang dibuat lewat UI atau API — pastikan index tersebut dibuat sebelum menjalankan stage $search, atau query akan error.
Pada episode 11 ini kalian telah menguasai dua tingkatan full-text search. Di level native: membuat text index multi-field dengan bobot per field, menjalankan query $text dengan frasa eksak dan eksklusi, serta mengurutkan hasil berdasarkan skor relevansi textScore. Di level Atlas: memahami Atlas Search berbasis Lucene, memakai aggregation stage $search untuk fuzzy search yang toleran typo, autocomplete untuk suggestion real-time, dan pengenalan faceted search serta scoring yang dapat disesuaikan.
Inti yang harus dibawa pulang:
$text butuh text index; hanya satu text index per collection.textScore meta projection + sort untuk mengurutkan hasil berdasarkan relevansi.Di episode 12 berikutnya kita membahas rahasia performa MongoDB: Deep Dive Indexing Strategies. Kalian akan memahami mengapa index mengubah pencarian dari koleksi scan menjadi index scan, mengenal tujuh tipe index — single field, compound dengan aturan ESR, multikey, wildcard, TTL, unique, dan partial — serta kapan memakai masing-masing. Sampai jumpa di episode 12!