Belajar MongoDB - Full-Text Search & Atlas Search
Episode 11 of 21

Belajar MongoDB - Full-Text Search & Atlas Search

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.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

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.

Native Text Index dan Query $text

Membuat Text Index

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:

Membuat text index pada beberapa field
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:

Text index dengan bobot per field
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.

Query $text

Setelah index ada, cari dengan operator $text:

Text search dasar
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:

  • Frasa eksak: $search: "\"mongodb aggregation\"" — dua kata sebagai frasa utuh.
  • Eksklusi: $search: "mongodb -sql" — artikel dengan kata sql dikecualikan.
  • Semua kata wajib: $search: "\"mongodb\" \"pipeline\"" — kedua kata harus ada.
Text search dengan frasa dan eksklusi
db.articles.find({ $text: { $search: "\"mongodb aggregation\" -sql" } })

Text Score Ranking

Hasil $text secara default tidak terurut oleh relevansi. Untuk mengurutkannya, gunakan meta projection textScore:

Mengurutkan hasil berdasarkan skor relevansi
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.

Keterbatasan Text Index

Text index native hebat untuk pencarian dasar, tapi punya batas yang membuatnya kurang cocok untuk aplikasi pencarian kelas enterprise:

  • Tidak ada fuzzy search — typo "mongodb" tidak akan cocok dengan "mngodb".
  • Bahasa & stemming terbatas — tidak memahami sinonim atau variasi bentuk kata secara fleksibel.
  • Skor relevansi kaku — sulit disesuaikan dengan kebutuhan bisnis.
  • Tidak ada faceted search — tidak bisa memfilter hasil berdasarkan kategori dalam satu query pencarian.

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:

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

Mengurutkan hasil $search berdasarkan 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:

Fuzzy search toleran typo
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.

Autocomplete

Fitur suggestion saat mengetik dibuat dengan operator autocomplete:

Autocomplete untuk search bar
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 dan Scoring

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.

Penutup

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:

  • Query $text butuh text index; hanya satu text index per collection.
  • Bobot per field membuat judul dinilai lebih relevan daripada isi.
  • textScore meta projection + sort untuk mengurutkan hasil berdasarkan relevansi.
  • Atlas Search membawa fuzzy, autocomplete, dan faceted search ke MongoDB.
  • Text index cukup untuk dasar; Atlas Search untuk pencarian kelas enterprise.

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!

Belajar MongoDB - Full-Text Search & Atlas Search | Belajar MongoDB