Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Melakukan pencarian teks dengan Amazon DocumentDB
Fitur pencarian teks lengkap asli Amazon DocumentDB (Indeks Teks v1) memungkinkan Anda melakukan pencarian teks pada kumpulan data tekstual besar menggunakan indeks teks tujuan khusus. Bagian ini menjelaskan fungsionalitas fitur indeks teks dan memberikan langkah-langkah tentang cara membuat dan menggunakan indeks teks di Amazon DocumentDB. Batasan pencarian teks juga terdaftar.
Topik
Fungsi yang didukung
Pencarian teks Amazon DocumentDB mendukung fungsionalitas kompatibel API MongoDB berikut:
Buat indeks teks pada satu bidang.
Buat indeks teks majemuk yang mencakup lebih dari satu bidang teks.
Lakukan pencarian satu kata atau multi-kata.
Kontrol hasil pencarian menggunakan bobot.
Urutkan hasil pencarian berdasarkan skor.
Gunakan indeks teks dalam pipeline agregasi.
Cari frasa yang tepat.
Menggunakan indeks teks Amazon DocumentDB
Untuk membuat indeks teks pada bidang yang berisi data string, tentukan string “teks” seperti yang ditunjukkan di bawah ini:
Indeks bidang tunggal:
db.test.createIndex({"comments": "text"})
Indeks ini mendukung permintaan pencarian teks di bidang string “komentar” dalam koleksi yang ditentukan.
Buat indeks teks majemuk pada lebih dari satu bidang string:
db.test.createIndex({"comments": "text", "title":"text"})
Indeks ini mendukung permintaan pencarian teks di bidang string “komentar” dan “judul” dalam koleksi yang ditentukan. Anda dapat menentukan hingga 30 bidang saat membuat indeks teks majemuk. Setelah dibuat, permintaan pencarian teks Anda akan menanyakan semua bidang yang diindeks.
catatan
Hanya satu indeks teks yang diperbolehkan pada setiap koleksi.
Mendaftarkan indeks teks pada koleksi Amazon DocumentDB
Anda dapat menggunakannya getIndexes() pada koleksi Anda untuk mengidentifikasi dan mendeskripsikan indeks, termasuk indeks teks, seperti yang ditunjukkan pada contoh berikut:
rs0:PRIMARY> db.test.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" }, { "v" : 1, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "contents_text", "ns" : "test.test", "default_language" : "english", "weights" : { "comments" : 1 }, "textIndexVersion" : 1 } ]
Setelah Anda membuat indeks, mulailah memasukkan data ke koleksi Amazon DocumentDB Anda.
db.test.insertMany([{"_id": 1, "star_rating": 4, "comments": "apple is red"}, {"_id": 2, "star_rating": 5, "comments": "pie is delicious"}, {"_id": 3, "star_rating": 3, "comments": "apples, oranges - healthy fruit"}, {"_id": 4, "star_rating": 2, "comments": "bake the apple pie in the oven"}, {"_id": 5, "star_rating": 5, "comments": "interesting couch"}, {"_id": 6, "star_rating": 5, "comments": "interested in couch for sale, year 2022"}])
Menjalankan kueri pencarian teks
Jalankan kueri pencarian teks satu kata
Anda perlu menggunakan $search operator $text dan untuk melakukan pencarian teks. Contoh berikut mengembalikan semua dokumen di mana bidang teks Anda yang diindeks berisi string “apel” atau “apel” dalam format lain seperti “apel”:
db.test.find({$text: {$search: "apple"}})
Output:
Output dari perintah ini terlihat seperti ini:
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
Jalankan pencarian teks multi-kata
Anda juga dapat melakukan pencarian teks multi-kata pada data Amazon DocumentDB Anda. Perintah di bawah ini mengembalikan dokumen dengan bidang teks yang diindeks berisi “apel” atau “pai”:
db.test.find({$text: {$search: "apple pie"}})
Output:
Output dari perintah ini terlihat seperti ini:
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
Jalankan pencarian teks frasa multi-kata
Untuk pencarian frasa multi-kata, gunakan contoh ini:
db.test.find({$text: {$search: "\"apple pie\""}})
Output:
Perintah di atas mengembalikan dokumen dengan bidang teks yang diindeks yang berisi frasa yang tepat “pai apel”. Output dari perintah ini terlihat seperti ini:
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
Jalankan pencarian teks dengan filter
Anda juga dapat menggabungkan pencarian teks dengan operator kueri lain untuk memfilter hasil berdasarkan kriteria tambahan:
db.test.find({$and: [{star_rating: 5}, {$text: {$search: "interest"}}]})
Output:
Perintah di atas mengembalikan dokumen dengan bidang teks yang diindeks yang berisi segala bentuk “minat” dan “star_rating” sama dengan 5. Output dari perintah ini terlihat seperti ini:
{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }
{ "_id" : 6, "star_rating" : 5, "comments" : "interested in couch for sale, year 2022" }
Batasi jumlah dokumen yang dikembalikan dalam pencarian teks
Anda dapat memilih untuk membatasi jumlah dokumen yang dikembalikan dengan menggunakanlimit:
db.test.find({$and: [{star_rating: 5}, {$text: {$search: "couch"}}]}).limit(1)
Output:
Perintah di atas mengembalikan satu hasil yang memenuhi filter:
{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }
Urutkan hasil berdasarkan skor teks
Contoh berikut mengurutkan hasil pencarian teks berdasarkan skor teks:
db.test.find({$text: {$search: "apple"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})
Output:
Perintah di atas mengembalikan dokumen dengan bidang teks yang diindeks berisi “apel”, atau “apel” dalam format lain seperti “apel”, dan mengurutkan hasil berdasarkan seberapa relevan dokumen terkait dengan istilah pencarian. Output dari perintah ini terlihat seperti ini:
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red", "score" : 0.6079270860936958 }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit", "score" : 0.6079270860936958 }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven", "score" : 0.6079270860936958 }
$textdan $search juga didukung untukaggregate,count,findAndModify,update, dan delete perintah.
Operator agregasi
Pipa agregasi menggunakan $match
db.test.aggregate( [{ $match: { $text: { $search: "apple pie" } } }] )
Output:
Perintah di atas mengembalikan hasil berikut:
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" }
{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }
{ "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" }
Kombinasi operator agregasi lainnya
db.test.aggregate( [ { $match: { $text: { $search: "apple pie" } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { score: { $meta: "textScore" } } } ] )
Output:
Perintah di atas mengembalikan hasil berikut:
{ "_id" : 4, "score" : 0.6079270860936958 }
{ "_id" : 1, "score" : 0.3039635430468479 }
{ "_id" : 2, "score" : 0.3039635430468479 }
{ "_id" : 3, "score" : 0.3039635430468479 }
Tentukan beberapa bidang saat membuat indeks teks
Anda dapat menetapkan bobot hingga tiga bidang dalam indeks teks majemuk Anda. Berat default yang ditetapkan untuk bidang dalam indeks teks adalah satu (1). Berat adalah parameter opsional dan harus dalam kisaran dari 1 hingga 100000.
db.test.createIndex( { "firstname": "text", "lastname": "text", ... }, { weights: { "firstname": 5, "lastname":10, ... }, name: "name_text_index" } )
Perbedaan dengan MongoDB
Fitur indeks teks Amazon DocumentDB menggunakan indeks terbalik dengan algoritma frekuensi istilah. Indeks teks jarang secara default. Karena perbedaan logika penguraian, pembatas tokenisasi, dan lainnya, set hasil yang sama dengan MongoDB mungkin tidak dikembalikan untuk kumpulan data atau bentuk kueri yang sama.
Perbedaan tambahan berikut antara indeks teks Amazon DocumentDB dan MongoDB ada:
Indeks majemuk menggunakan indeks non-teks tidak didukung.
Indeks teks Amazon DocumentDB tidak peka huruf besar/kecil.
Hanya bahasa Inggris yang didukung dengan indeks teks.
Pengindeksan teks bidang array (atau multi-kunci) tidak didukung. Misalnya, membuat indeks teks pada “a “dengan dokumen {“a”: [“apple”, “pie”]} akan gagal.
Pengindeksan teks wildcard tidak didukung.
Indeks teks unik tidak didukung.
Mengecualikan istilah tidak didukung.
Praktik dan pedoman terbaik
Untuk kinerja optimal pada kueri pencarian teks yang melibatkan penyortiran berdasarkan skor teks, buat indeks teks sebelum memuat data.
Indeks teks memerlukan penyimpanan tambahan untuk salinan internal data yang diindeks yang dioptimalkan. Ini memiliki implikasi biaya tambahan.
Indeks Teks V2
Amazon DocumentDB 8.0 memperkenalkan versi baru indeks teks (V2) yang mengubah parser pencarian teks yang mendasarinya untuk menghadirkan lebih banyak kompatibilitas dengan MongoDB.
Selain fungsi yang disediakan oleh indeks teks V1, indeks teks V2 juga menyediakan dukungan berikut:
Perencana memindahkan tahap $match lebih awal dalam pipeline jika memungkinkan, mengurangi jumlah dokumen yang diproses oleh tahapan berikutnya.
Peningkatan tokenisasi karakter khusus di bidang teks, seperti email, URL, dan jalur file. V2 dapat mengurai dan mencocokkan token individu dalam string ini, sedangkan V1 tidak bisa.
rs0:PRIMARY> db.coll.createIndex({ "a": "text" }); rs0:PRIMARY> db.coll.find() { "_id" : 1, "a" : "jane.doe_1234@company.com" } { "_id" : 2, "a" : "janedoe@company.com" } { "_id" : 3, "a" : "/home/user/company/thesis.pdf" } { "_id" : 4, "a" : "/home/user/path/jane.pdf" } { "_id" : 5, "a" : "http://www.company.com/path" } { "_id" : 6, "a" : "https://company.com/path/../home" } // Sample query rs0:PRIMARY> db.coll.find({ $text: { $search: "jane" } }); // V1 text index — no results None // V2 text index — matches tokens within emails and file paths { "_id" : 1, "a" : "jane.doe_1234@company.com" } { "_id" : 4, "a" : "/home/user/path/jane.pdf" }
Batasan
Pencarian teks memiliki batasan berikut di Amazon DocumentDB:
Indeks teks menyimpan leksem dan informasi posisinya. Ukuran gabungan semua leksem dan informasi posisinya, dalam satu dokumen, dibatasi hingga 1MB.