Gunakan fitur Text Search di Cloud Firestore untuk menelusuri string tertentu dalam koleksi.
Sebelum memulai
Sebelum Anda mulai menggunakan penelusuran 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.
Menjalankan penelusuran teks
Penelusuran teks menggunakan operator $text di dalam filter.
Tentukan string yang dikueri dalam argumen $search.
Menjalankan penelusuran teks umum
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 kesetaraan "and" 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 Text Search menggunakan "and".
Menetapkan bahasa penelusuran teks
Anda dapat menetapkan bahasa Text Search menggunakan argumen $language. Misalnya:
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, konfigurasikan istilah sebagai urutan kata yang diapit oleh tanda petik 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 Anda lebih presisi, tentukan rangkaian 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, awali istilah dengan tanda hubung (-):
# 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:
# 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"} } },
]);
Luaskan penelusuran
Untuk meningkatkan relevansi hasil penelusuran teks, operator $text menambah
string penelusuran sesuai dengan bahasa yang ditentukan untuk menyertakan kecocokan untuk
sinonim yang peka konteks, bentuk kata dasar, istilah yang ejaannya dikoreksi,
variasi diakritik, dan lainnya.
Keterbatasan
- Operator
$neardan operator$texttidak dapat digunakan dalam penelusuran teks yang sama. - Satu operator
$textdiizinkan per penelusuranfindatauaggregation. - 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 yang diurutkan yang ada untuk mengoptimalkan penelusuran. Jika disjungsi lainnya tidak diindeks, penelusuran akan mengandalkan pemindaian koleksi. $texttidak dapat digunakan dengan petunjuk.- Kueri dengan Text Search tidak dapat diurutkan berdasarkan
$natural.