Menggunakan penelusuran teks

Gunakan fitur penelusuran teks di Firestore dengan kompatibilitas MongoDB untuk menelusuri string tertentu dalam koleksi.

Sebelum memulai

Sebelum mulai menggunakan penelusuran teks, lakukan hal berikut:

  1. Pastikan Anda memiliki akses ke database operasi yang kompatibel dengan MongoDB, atau Buat database dan hubungkan ke database tersebut.

  2. Pastikan Anda memiliki indeks teks, atau Buat indeks teks.

Penelusuran teks menggunakan operator $text di dalam filter. Tentukan string yang dikueri dalam argumen $search.

Jalankan perintah berikut untuk melakukan penelusuran teks umum:

  # Find search
  db.cities.find({ $text: { $search: "french bread" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "french bread" } } }
  ]);

Jika indeks Anda dipartisi, Anda dapat memfilter berdasarkan partisi dengan menyertakan partisi dalam filter kesamaan "dan" dalam penelusuran Anda. Misalnya, jika Anda memiliki partisi city, Anda dapat memfilter penelusuran teks sebagai berikut:

db.myCollection.find( { $and: [
  { $text: { $search: "french bread" } },
  { "city": "Paris" }
] } )

Anda juga dapat memfilter agregasi berdasarkan partisi. Contoh:

db.myCollection.aggregate([
 { $match: { $text: { $search: "french bread" } } },
 { "city": "Paris" }
] );

Nilai partisi Anda harus berupa string. Filter partisi Anda harus digabungkan ke penelusuran teks menggunakan "dan".

Menetapkan bahasa penelusuran teks

Anda dapat menetapkan bahasa penelusuran teks menggunakan argumen $language. Contoh:

  db.cities.find({ $text: { $search: "french bread", $language: "en"} })

Jika Anda tidak menetapkan bahasa, penelusuran akan menggunakan bahasa indeks teks.

Menelusuri istilah yang sama persis

Untuk menelusuri istilah yang sama persis, konfigurasi istilah sebagai urutan kata yang diapit tanda kutip ganda. Contoh:

  # Find search
  db.cities.find({ $text: { $search: "\"best french bread\"" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best french bread\"" } } },
  ]);

Menelusuri kombinasi istilah

Untuk membuat penelusuran teks lebih akurat, tentukan rantai istilah. Misalnya, penelusuran berikut menampilkan dokumen yang cocok dengan kombinasi best AND french AND ("bread" OR "is"):

  # Find search
  db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
  ]);

Mengecualikan istilah

Untuk mengecualikan istilah dari penelusuran teks, tambahkan tanda hubung (-) di awal istilah:

  # Find search
  db.cities.find({ $text: { $search: "best bread -french"} })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "best bread -french" } } },
  ]);

Menghitung skor relevansi

Gunakan ekspresi {$meta: "textScore"} untuk menghitung skor relevansi dokumen yang cocok dengan penelusuran teks. Untuk mengurutkan hasil dalam urutan skor menurun, gunakan $meta dalam ekspresi pengurutan. Pertimbangkan contoh berikut, dengan SCORE_FIELD adalah nama kolom yang digunakan untuk menyimpan nilai skor value:

  # Find search
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .sort({ SCORE_FIELD: { $meta: "textScore" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
  ]);

Anda juga dapat menggunakan skor teks dalam ekspresi proyeksi. Contoh:

  # Find search
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .project({ score: { $meta: "textScore" } })

  # Aggregation search
  db.cities.aggregate([
    { $match: { $text: { $search: "best french bread" } } },
    { $project: { "scoreField": { $meta: "textScore"} } },
  ]);

Untuk meningkatkan relevansi hasil penelusuran teks, operator $text akan menambah string penelusuran sesuai dengan bahasa yang ditentukan untuk menyertakan kecocokan untuk sinonim yang sesuai konteks, bentuk berimbuhan, istilah yang dikoreksi ejaannya, variasi diakritik, dan lainnya.

Batasan

  • Operator $near dan operator $text tidak dapat digunakan dalam penelusuran teks yang sama.
  • Satu operator $text diizinkan per penelusuran find atau aggregation.
  • Dalam agregasi, tahap $match dengan $text harus menjadi tahap pipeline pertama.
  • $text hanya dapat disarangkan di dalam $and dan $or.
  • Jika $text berada di dalam $or, disjungsi non-penelusuran dapat menggunakan indeks berurutan yang ada untuk mengoptimalkan penelusuran. Jika disjungsi lainnya tidak diindeks, penelusuran akan mengandalkan pemindaian koleksi.
  • $text tidak dapat digunakan dengan petunjuk.
  • Kueri dengan penelusuran teks tidak dapat diurutkan berdasarkan $natural.