Menggunakan kueri teks

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

Sebelum memulai

Sebelum Anda mulai menggunakan kueri 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.

Izin IAM

Untuk membuat indeks di Firestore dengan kompatibilitas MongoDB, pastikan Anda diberi salah satu peran berikut:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

Untuk memberikan peran, lihat Memberikan satu peran. Untuk mengetahui informasi selengkapnya tentang peran Firestore dan izin terkait, lihat Peran yang telah ditetapkan.

Jika Anda telah menentukan peran khusus, tetapkan semua izin berikut untuk membuat indeks:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

Menjalankan kueri teks

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

Menjalankan kueri teks umum

Jalankan kueri berikut untuk melakukan kueri umum:

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

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

Jika indeks Anda dipartisi, Anda dapat memfilter berdasarkan partisi dengan menyertakan partisi dalam filter kesetaraan "dan" dalam kueri Anda. Misalnya, jika Anda memiliki partisi city, Anda dapat memfilter kueri 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 kueri menggunakan "dan".

Menetapkan bahasa kueri

Anda dapat menetapkan bahasa kueri menggunakan argumen $language. Contoh:

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

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

Mengkueri istilah persis

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

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

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

Mengkueri kombinasi istilah

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

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

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

Mengecualikan istilah

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

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

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

Menghitung skor relevansi

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

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

  # Aggregation query
  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 query
  db.cities
    .find({ $text: { $search: "best french bread" } })
    .project({ score: { $meta: "textScore" } })

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

Memperluas kueri

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

Batasan

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