Gunakan fitur penelusuran teks di Cloud Firestore untuk menelusuri string tertentu dalam koleksi.
Sebelum memulai
Sebelum Anda mulai menggunakan kueri teks, lakukan hal berikut:
Pastikan Anda memiliki akses ke database operasi yang kompatibel dengan MongoDB yang ada, atau Buat database dan hubungkan ke database tersebut.
Pastikan Anda memiliki indeks teks, atau Buat indeks teks.
Izin IAM
Untuk membuat indeks di Cloud Firestore, pastikan Anda diberi salah satu peran berikut:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Untuk memberikan peran, lihat Memberikan satu peran. Untuk mengetahui informasi selengkapnya tentang peran Cloud Firestore dan izin terkait, lihat Peran yang telah ditetapkan.
Jika Anda telah menentukan peran khusus, tetapkan semua izin berikut untuk membuat indeks:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.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 "and".
Menetapkan bahasa kueri
Anda dapat menetapkan bahasa kueri menggunakan argumen $language. Contoh:
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
Jika Anda tidak menyetel bahasa kueri, kueri akan menggunakan bahasa indeks teks.
Membuat kueri untuk istilah yang sama persis
Untuk membuat kueri istilah yang sama persis, konfigurasikan 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\"" } } },
]);
Membuat kueri kombinasi istilah
Untuk membuat kueri Anda lebih tepat, tentukan rangkaian istilah. Misalnya, kueri berikut menampilkan dokumen yang cocok dengan kombinasi terbaik AND prancis AND ("roti" OR "adalah"):
# 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 depan 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. Pertimbangkan contoh berikut,
dengan SCORE_FIELD adalah nama kolom yang digunakan untuk menyimpan nilai skor:
# 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"} } },
]);
Luaskan kueri
Untuk meningkatkan relevansi hasil kueri, operator $text memperluas string penelusuran sesuai dengan bahasa yang ditentukan untuk menyertakan kecocokan untuk sinonim yang sadar konteks, bentuk berimbuhan, istilah yang dikoreksi ejaannya, variasi diakritik, dan lainnya.
Keterbatasan
- Operator
$neardan operator$texttidak dapat digunakan dalam kueri yang sama. - Satu operator
$textdiizinkan per kuerifindatauaggregation. - Dalam agregasi, tahap
$matchdengan$textharus menjadi tahap pipeline pertama. $texthanya dapat disusun bertingkat di dalam$anddan$or.- Jika
$textberada di dalam$or, disjungsi non-penelusuran dapat menggunakan indeks berurutan yang ada untuk mengoptimalkan kueri. Jika disjungsi lainnya tidak diindeks, kueri akan mengandalkan pemindaian koleksi. $texttidak dapat digunakan dengan petunjuk kueri.- Kueri dengan penelusuran teks tidak dapat diurutkan berdasarkan
$natural.