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 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
Fungsionalitas yang didukung
Pencarian teks Amazon DocumentDB mendukung fungsi kompatibel API MongoDB berikut:
Buat indeks teks pada satu bidang.
Buat indeks teks majemuk yang menyertakan lebih dari satu bidang teks.
Lakukan pencarian kata tunggal atau multi-kata.
Kontrol hasil pencarian menggunakan bobot.
Urutkan hasil pencarian berdasarkan skor.
Gunakan indeks teks dalam pipa agregasi.
Cari frase 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 kueri 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 kueri 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, kueri penelusuran teks Anda akan menanyakan semua bidang yang diindeks.
catatan
Hanya satu indeks teks yang diizinkan pada setiap koleksi.
Daftar indeks teks pada koleksi Amazon DocumentDB
Anda dapat menggunakan getIndexes()
pada koleksi Anda untuk mengidentifikasi dan mendeskripsikan indeks, termasuk indeks teks, seperti yang ditunjukkan pada contoh di bawah ini:
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 dalam 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 penelusuran teks satu kata
Anda perlu menggunakan $text
dan $search
operator untuk melakukan pencarian teks. Contoh berikut mengembalikan semua dokumen di mana bidang teks 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 yang berisi “apple” atau “pie”:
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 frase multi-kata
Untuk pencarian frase multi-kata, gunakan contoh ini:
db.test.find({$text: {$search: "\"apple pie\""}})
Output:
Perintah di atas mengembalikan dokumen dengan bidang teks diindeks yang berisi frase yang tepat “apple pie”. 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 yang diindeks teks yang berisi “apel”, atau “apel” dalam format lain seperti “apel”, dan mengurutkan hasilnya berdasarkan seberapa relevan dokumen tersebut 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 }
$text
dan $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 sebagai berikut:
{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" }
{ "_id" : 3, "star_rating" : 3, "comments" : "apple - a 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 dari 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 sebagai 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. Bobot default yang ditetapkan ke bidang dalam indeks teks adalah satu (1). Berat adalah parameter opsional dan harus dalam kisaran 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 dalam logika parsing, pembatas tokenisasi, dan lainnya, set hasil yang sama seperti 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 dan tidak sensitif terhadap diakritik.
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.
Tidak termasuk istilah tidak didukung.
Praktik dan pedoman terbaik
Untuk kinerja optimal pada kueri penelusuran teks yang melibatkan pengurutan berdasarkan skor teks, sebaiknya Anda membuat indeks teks sebelum memuat data.
Indeks teks memerlukan penyimpanan tambahan untuk salinan internal yang dioptimalkan dari data yang diindeks. Ini memiliki implikasi biaya tambahan.
Batasan
Pencarian teks memiliki batasan berikut di Amazon DocumentDB:
Pencarian teks hanya didukung di kluster berbasis instans Amazon DocumentDB 5.0.