Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Indeks adalah struktur yang meningkatkan kecepatan pengambilan data dengan menyediakan akses cepat ke bidang dalam koleksi. Mereka bekerja dengan membuat sekumpulan pointer yang diurutkan ke data, sering kali berdasarkan bidang kunci. Azure DocumentDB menggunakan indeks dalam beberapa konteks, termasuk pendorongan kueri ke bawah, batasan unik, dan sharding.
Penting
Bidang "_id" adalah satu-satunya bidang yang diindeks secara default & ukuran maksimum bidang bisa .2 KB Disarankan untuk menambahkan indeks tambahan berdasarkan filter kueri & predikat untuk mengoptimalkan performa.
Jenis indeks
Untuk kesederhanaan, mari kita pertimbangkan contoh aplikasi blog dengan penyiapan berikut:
-
Nama database:
cosmicworks -
Nama koleksi:
products
Contoh aplikasi ini menyimpan artikel sebagai dokumen dengan struktur berikut. Semua contoh yang dikutip lebih lanjut menggunakan struktur koleksi ini.
{
"_id": ObjectId("617a34e7a867530bff1b2346"),
"title": "Azure DocumentDB - A Game Changer",
"content": "Azure DocumentDB is a globally distributed, multi-model database service.",
"author": {lastName: "Doe", firstName: "John"},
"category": "Technology",
"launchDate": ISODate("2024-06-24T10:08:20.000Z"),
"published": true
}
Indeks bidang tunggal
Indeks bidang tunggal menyimpan informasi dari satu bidang dalam koleksi. Urutan pengurutan indeks bidang tunggal tidak masalah.
_id bidang tetap diindeks secara default.
Azure DocumentDB mendukung pembuatan indeks saat berikut
- Bidang dokumen tingkat teratas.
- Dokumen yang disematkan.
- Bidang dalam dokumen yang disematkan.
Perintah berikut membuat indeks bidang tunggal pada bidang author dan perintah berikut membuatnya pada bidang firstNameyang disematkan .
use cosmicworks
db.products.createIndex({"author": 1})
// indexing embedded property
db.products.createIndex({"author.firstName": -1})
Satu kueri dapat menggunakan beberapa indeks bidang tunggal jika tersedia.
Nota
Azure DocumentDB memungkinkan pembuatan maksimum 64 indeks pada koleksi. Tergantung pada tingkatannya, kita dapat merencanakan ekstensi hingga 300 indeks berdasarkan permintaan.
Indeks gabungan
Indeks majemuk meningkatkan performa database dengan memungkinkan kueri dan pengurutan yang efisien berdasarkan beberapa bidang dalam dokumen. Pengoptimalan ini mengurangi kebutuhan untuk memindai seluruh koleksi, mempercepat pengambilan data dan organisasi.
Perintah berikut membuat indeks majemuk pada bidang author dan launchDate dalam urutan pengurutan yang berlawanan.
use cosmicworks
db.products.createIndex({"author":1, "launchDate":-1})
Order bidang memengaruhi selektivitas atau pemanfaatan indeks. Kueri find tidak akan menggunakan indeks yang dibuat.
use cosmicworks
db.products.find({"launchDate": {$gt: ISODate("2024-06-01T00:00:00.000Z")}})
Keterbatasan
- Maksimum 32 bidang\jalur dalam indeks gabungan.
Indeks parsial
Indeks yang memiliki filter kueri terkait yang menjelaskan kapan harus menghasilkan istilah dalam indeks.
use cosmicworks
db.products.createIndex (
{ "author": 1, "launchDate": 1 },
{ partialFilterExpression: { "launchDate": { $gt: ISODate("2024-06-24T10:08:20.000Z") } } }
)
Keterbatasan
- Indeks parsial tidak mendukung
ORDER BYatauUNIQUEkecuali filter memenuhi syarat.
Indeks teks
Indeks teks adalah struktur data khusus yang mengoptimalkan kueri berbasis teks, membuatnya lebih cepat dan lebih efisien.
Gunakan metode createIndex dengan opsi text untuk membuat indeks teks pada bidang title.
use cosmicworks;
db.products.createIndex({ title: "text" })
Nota
Meskipun Anda hanya dapat menentukan satu indeks teks per koleksi, Azure DocumentDB memungkinkan Anda membuat indeks teks pada kombinasi beberapa bidang untuk memungkinkan Anda melakukan pencarian teks di berbagai bidang di dokumen Anda.
Mengonfigurasi opsi indeks teks
Indeks teks di Azure DocumentDB dilengkapi dengan beberapa opsi untuk menyesuaikan perilakunya. Misalnya, Anda dapat menentukan bahasa untuk analisis teks, mengatur bobot untuk memprioritaskan bidang tertentu, dan mengonfigurasi pencarian tanpa peka huruf besar/kecil. Berikut adalah contoh pembuatan indeks teks dengan opsi:
Buat indeks untuk mendukung pencarian di
titlebidang dancontentdengan dukungan bahasa Inggris. Selain itu, tetapkan bobot yang lebih tinggi ketitlebidang untuk memprioritaskannya dalam hasil pencarian.use cosmicworks db.products.createIndex( { title: "text", content: "text" }, { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false } )
Nota
Ketika klien melakukan kueri pencarian teks dengan istilah "DocumentDB", skor untuk setiap dokumen dalam koleksi akan dihitung berdasarkan kehadiran dan frekuensi istilah di bidang "judul" dan "konten", dengan kepentingan yang lebih tinggi diberikan ke bidang "judul" karena bobotnya yang lebih tinggi.
Melakukan pencarian teks menggunakan indeks teks
Setelah indeks teks dibuat, Anda dapat melakukan pencarian teks menggunakan operator "teks" dalam kueri Anda. Operator teks mengambil string pencarian dan mencocokkannya dengan indeks teks untuk menemukan dokumen yang relevan.
Lakukan pencarian teks untuk frasa
DocumentDB.use cosmicworks db.products.find( { $text: { $search: "DocumentDB" } } )Secara opsional, gunakan
$metaoperator proyeksi bersama dengantextScorebidang dalam kueri untuk melihat bobotuse cosmicworks db.products.find( { $text: { $search: "DocumentDB" } }, { score: { $meta: "textScore" } } )
Keterbatasan
- Hanya satu indeks teks yang dapat ditentukan pada koleksi.
- Operasi pengurutan tidak dapat menggunakan pengurutan indeks teks di MongoDB.
- Hint() tidak didukung dalam kombinasi dengan kueri menggunakan ekspresi $text.
- Indeks teks bisa relatif besar, mengkonsumsi ruang penyimpanan yang signifikan dibandingkan dengan jenis indeks lainnya.
Indeks Kartu Liar
Indeks pada bidang tunggal, mengindeks semua jalur di bawah field , tidak termasuk bidang lain yang berada pada tingkat yang sama. Misalnya, untuk dokumen sampel berikut
{
"children":
{
"familyName": "Merriam",
"pets": { "details": {“name”: "Goofy", ”age”: 3} }
}
}
Membuat indeks pada { "pets.$**": 1 }, membuat indeks pada detail & properti subdokumen tetapi tidak membuat indeks pada "familyName".
Keterbatasan
- Indeks pencocokan bebas tidak mendukung indeks unik.
- Indeks wildcard
ORDER BYtidak mendukung penurunan kecuali jika filter hanya menyertakan jalur yang ada dalam wildcard (karena mereka tidak mengindeks elemen yang tidak ditentukan) - Indeks kartubebas gabungan hanya dapat memiliki
oneistilah kartubebas danoneatau lebih istilah indeks.{ "pets.$**": 1, “familyName”: 1 }
Indeks geospasial
Indeks geospasial mendukung kueri pada data yang disimpan sebagai objek GeoJSON atau pasangan koordinat warisan. Anda dapat menggunakan indeks geospasial untuk meningkatkan performa kueri pada data geospasial atau untuk menjalankan kueri geospasial tertentu.
Azure DocumentDB menyediakan dua jenis indeks geospasial:
- Indeks 2dsphere, yang mendukung kueri yang menginterpretasikan geometri pada sfer.
- Indeks 2d, yang mendukung kueri yang menginterpretasikan geometri pada permukaan datar.
Indeks 2D
Indeks 2d hanya didukung dengan gaya pasangan koordinat warisan untuk menyimpan data geospasial.
Gunakan metode createIndex dengan opsi 2d untuk membuat indeks geospasial pada kolom location.
db.places.createIndex({ "location": "2d"});
Keterbatasan
- Hanya
onebidang lokasi yang dapat menjadi bagian2ddari indeks dan hanyaonebidang non-geospasial lainnya yang dapat menjadi bagiancompound 2ddari indeksdb.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })
Indeks 2dsphere
2dsphere indeks mendukung kueri geospasial pada bola yang menyerupai bumi. Ini dapat mendukung objek GeoJSON atau pasangan koordinat warisan.
2dSphere indeks bekerja dengan gaya GeoJSON untuk menyimpan data, jika titik warisan ditemui maka akan dikonversi ke titik GeoJSON.
Gunakan metode createIndex dengan opsi 2dsphere untuk membuat indeks geospasial di bidang location.
db.places.createIndex({ "location": "2dsphere"});
2dsphere indeks memungkinkan pembuatan indeks pada beberapa bidang data geospasial dan beberapa bidang data non-geospasial.
db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })
Keterbatasan
Indeks gabungan yang menggunakan indeks reguler dan indeks geospasial tidak didukung. Membuat salah satu indeks geospasial akan menyebabkan kesalahan.
// Compound Regular & 2dsphere indexes are not supported yet db.collection.createIndex({a: 1, b: "2dsphere"}) // Compound 2d indexes are not supported yet db.collection.createIndex({a: "2d", b: 1})Poligon dengan lubang tidak berfungsi. Menyisipkan Poligon berlubang tidak dibatasi meski
$geoWithinkueri gagal untuk skenario:Jika kueri itu sendiri memiliki poligon dengan lubang
coll.find( { "b": { "$geoWithin": { "$geometry": { "coordinates": [ [ [ 0, 0], [0, 10], [10, 10],[10,0],[0, 0] ], [ [5, 5], [8, 5], [ 8, 8], [ 5, 8], [ 5, 5] ] ], "type": "Polygon" } } } }) // MongoServerError: $geoWithin currently doesn't support polygons with holesJika ada dokumen yang tidak difilter yang memiliki poligon dengan lubang.
[mongos] test> coll.find() [ { _id: ObjectId("667bf7560b4f1a5a5d71effa"), b: { type: 'Polygon', coordinates: [ [ [ 0, 0 ], [ 0, 10 ], [ 10, 10 ], [ 10, 0 ], [ 0, 0 ] ], [ [ 5, 5 ], [ 8, 5 ], [ 8, 8 ], [ 5, 8 ], [ 5, 5 ] ] ] } } ] // MongoServerError: $geoWithin currently doesn't support polygons with holeskeybidang wajib saat menggunakangeoNear.[mongos] test> coll.aggregate([{ $geoNear: { $near: { "type": "Point", coordinates: [0, 0] } } }]) // MongoServerError: $geoNear requires a 'key' option as a String
Langkah selanjutnya
- Pelajari tentang mengindeks Praktik terbaik untuk hasil yang paling efisien.
- Pelajari tentang pengindeksan latar belakang
- Pelajari di sini untuk bekerja dengan pengindeksan Teks.
- Pelajari di sini tentang pengindeksan Wildcard.