Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Manajemen indeks di Amazon DocumentDB dengan Java
Indeks memungkinkan pengambilan data yang efisien dari koleksi Amazon DocumentDB. Tanpa indeks, DocumentDB harus memindai setiap dokumen dalam koleksi untuk mengembalikan hasil yang memenuhi kueri yang diberikan. Topik ini memberikan informasi tentang cara membuat, menjatuhkan, dan daftar indeks menggunakan driver MongoDB Java. Ini juga membahas bagaimana menentukan apakah indeks tertentu digunakan dalam kueri dan bagaimana memberikan petunjuk ke Amazon DocumentDB untuk menggunakan indeks tertentu.
Amazon DocumentDB mendukung banyak jenis indeks. Untuk ikhtisar komprehensif dari semua indeks yang didukung, lihat posting blog
Membuat indeks dengan Java
Ada dua mekanisme untuk membuat indeks di Amazon DocumentDB menggunakan runCommand()
driver Java MongoDB: melalui, dan createIndex()
dengan metode untuk indeks tunggal atau metode untuk beberapa indeks. createIndexes()
Salah satu alasan untuk menggunakan createIndexes()
metode createIndex()
dan adalah Anda dapat membangun penanganan kesalahan yang lebih baik dengan menangkap kesalahan tertentu yang terkait dengan pembuatan indeks. Alasan lain untuk menggunakan metode ini runCommand()
adalah bahwa driver MongDB Java menyediakan serangkaian kelas pendukung yang kaya untuk pembuatan dan manipulasi indeks. Perhatikan bahwa kelas-kelas pendukung ini hanya dapat digunakan ketika Anda menggunakan createIndexes()
metode createIndex()
atau. Ada tiga kelas pendukung:
Indexes
— Kelas ini berfungsi sebagai kelas utilitas yang menawarkan metode pabrik statis untuk membuat berbagai jenis indeks. Ini menyederhanakan proses pembuatan definisi indeks yang kompleks dan umumnya digunakan bersama dengan kelas terkait indeks lainnya. IndexModel
— Ini adalah kelas fundamental yang merangkum definisi kunci indeks dan opsinya. Ini merupakan spesifikasi indeks lengkap, menggabungkan apa yang harus diindeks (kunci) dengan cara mengindeks (opsi). Kelas ini sangat berguna saat membuat beberapa indeks secara bersamaan, karena memungkinkan Anda untuk menentukan kumpulan spesifikasi indeks yang dapat diteruskan ke createIndexes()
metode.IndexOptions
— Ini adalah kelas konfigurasi komprehensif yang menyediakan serangkaian metode yang kaya untuk menyesuaikan perilaku indeks. Ini termasuk pengaturan untuk indeks unik, indeks jarang, waktu kedaluwarsa (TTL), dan ekspresi filter parsi. Melalui rantai metode, Anda dapat mengonfigurasi beberapa opsi seperti pembuatan indeks latar belakang dan kendala unik.
Buat indeks tunggal
Contoh ini menunjukkan cara membuat indeks tunggal menggunakan metodecreateIndex(
) di latar belakang. Untuk memahami latar belakang dan pembuatan indeks latar depan, silakan lihatJenis build indeks. Contoh kode berikut digunakan IndexOptions
IndexOptions
Objek ini kemudian diteruskan ke createIndex()
metode.
collection.createIndex( Indexes.ascending("restaurantId"), new IndexOptions() .unique(true) .name("unique_restaurantId_idx") .background(true));
Buat beberapa indeks
Contoh ini membuat beberapa indeks menggunakan createIndexes()
metode ini. Ini pertama membangun opsi untuk setiap indeks dengan menggunakan IndexModel
IndexModel
objek ke createIndexes()
metode. Contoh kode berikut menunjukkan cara membuat indeks komposit dengan menggunakan kelas Indexes
listIndexes()
// Single Field Index on cuisine IndexModel singleIndex = new IndexModel( Indexes.ascending("cuisine"), new IndexOptions().name("cuisine_idx")); // Compound Index IndexModel compoundIndex = new IndexModel( Indexes.compoundIndex( Indexes.ascending("address.state"), Indexes.ascending("priceRange")), new IndexOptions().name("location_price_idx")); // Build a list of IndexModel for the indexes List < IndexModel > indexes = Arrays.asList( singleIndex, compoundIndex ); collection.createIndexes(indexes); // Verify created indexes collection.listIndexes().forEach(index - > System.out.println("Created index: " + index.toJson()));
Buat indeks yang jarang dan sebagian
Contoh ini menunjukkan menciptakan indeks jarang dan sebagian dengan membuat IndexModel
// Sparse Index Model, this will identify only those documents that have a // michelin star rating IndexModel sparseIndex = new IndexModel( Indexes.ascending("michelin.star"), new IndexOptions() .name("michelin_sparse_idx") .sparse(true)); // Partial Index Model where the restaurant is active and has a rating of 4 and above IndexModel partialIndex = new IndexModel( Indexes.ascending("rating.average"), new IndexOptions() .name("high_rated_active_idx") .partialFilterExpression( Filters.and( Filters.eq("isActive", true), Filters.gte("rating.average", 4.0))));
Buat indeks teks
Contoh ini menunjukkan cara membuat indeks teks. Hanya satu indeks teks yang diizinkan pada koleksi tetapi satu indeks teks dapat menjadi indeks gabungan yang mencakup beberapa bidang. Saat menggunakan beberapa bidang dalam indeks teks, Anda juga dapat menetapkan bobot ke masing-masing bidang dalam indeks. Indeks teks pada bidang array tidak didukung oleh Amazon DocumentDB dan meskipun Anda dapat menggunakan hingga 30 bidang dalam indeks teks majemuk, hanya tiga bidang yang dapat diberi bobot.
IndexModel textIndex = new IndexModel( new Document() .append("name", "text") .append("description", "text") .append("cuisine", "text"), new IndexOptions() .name("restaurant_text_idx") .weights(new Document() .append("name", 10) // Restaurant name gets highest weight .append("description", 5) // Description get medium weight .append("cuisine", 2) // Cuisine type gets low weight )); collection.createIndex(textIndex.getKeys(), textIndex.getOptions());
Buat indeks menggunakan runCommand()
Amazon DocumentDB mendukung pembuatan indeks paralel untuk mengurangi waktu yang dibutuhkan untuk membuat indeks. Pengindeksan paralel menggunakan beberapa pekerja bersamaan. Pekerja default yang digunakan untuk pembuatan indeks adalah dua. Posting blogcreateIndex()
atau createIndexes()
dan oleh karena itu satu-satunya cara untuk menentukan pekerja adalah melalui. runCommand
Contoh kode berikut menunjukkan cara menggunakan runCommand
untuk membuat indeks yang meningkatkan pekerja menjadi empat:
Document command = new Document("createIndexes", "Restaurants") .append("indexes", Arrays.asList( new Document("key", new Document("name", 1)) .append("name", "restaurant_name_idx") .append("workers", 4) // Specify number of workers )); Document commendResult = connectedDB.runCommand(command);
Menjatuhkan indeks
Driver MongoDB Java menyediakan beberapa metode untuk menjatuhkan indeks, melayani berbagai skenario dan preferensi Anda. Anda dapat menjatuhkan indeks berdasarkan nama, spesifikasi kunci, atau menjatuhkan semua indeks sekaligus. Metode dropIndex()
dan dropIndexes()
dapat dipanggil pada objek koleksi untuk menjatuhkan indeks. Saat menjatuhkan indeks berdasarkan nama, Anda harus memastikan mereka menggunakan nama indeks yang benar yang mungkin tidak selalu intuitif, terutama untuk indeks gabungan atau yang dihasilkan secara otomatis. Mencoba menjatuhkan indeks yang tidak ada akan menghasilkan a. MongoCommandException
default _id
Indeks tidak dapat dijatuhkan karena memastikan keunikan dokumen dalam koleksi.
Contoh kode berikut menunjukkan menunjukkan bagaimana untuk menjatuhkan indeks dengan memberikan nama bidang di mana indeks dibuat atau dengan menghapus semua indeks:
String indexName = "unique_restaurantId_idx"; Document keys = new Document("cuisine", 1); // Drop index by name collection.dropIndex(indexName); // Drop index by keys collection.dropIndex(keys); // Drop all indexes collection.dropIndexes();
Saat menjatuhkan indeks menggunakan beberapa kunci, pastikan ada indeks gabungan yang berisi semua kunci yang ditentukan dan urutan kunci sudah benar. Kode contoh pembuatan indeks di atas menunjukkan kunci majemuk pada “masakan” dan fitur. Jika Anda mencoba menjatuhkan kunci majemuk itu tetapi urutannya bukan yang digunakan untuk pembuatan, maka terjadi MongoCommnadException kesalahan sebagai berikut:
Document keys = new Document("features", 1) .append("cuisine", 1); try { // Drop index by keys collection.dropIndex(keys); System.out.println("Successfully dropped index with keys: " + keys.toJson()); } catch (MongoCommandException commErr) { System.out.println("Error dropping index: " + commErr.getErrorMessage()); throw new RuntimeException("MongoCommandException was thrown while dropping index", commErr); }
Kesalahan berikut ditampilkan:
Error dropping index: Cannot drop index: index not found.
Tests run: 3, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.819 sec <<< FAILURE!
com.amazon.docdb.guide.DocDBGuideTest.testindexGuide() Time elapsed: 0.817 sec <<< FAILURE!
org.opentest4j.AssertionFailedError: Unexpected exception thrown: java.lang.RuntimeException: MongoCommandException was thrown while dropping index
Menentukan pemilihan indeks dan memberikan petunjuk indeks
Bekerja dengan fungsionalitas jelaskan di Amazon DocumentDB sangat penting bagi Anda untuk memahami kinerja kueri dan penggunaan indeks. Saat menjalankan kueri, Anda dapat menambahkan explain()
metode untuk mendapatkan informasi rinci tentang rencana kueri, termasuk indeks mana, jika ada, yang sedang digunakan. explain()
Output memberikan wawasan tentang tahapan eksekusi kueri, jumlah dokumen yang diperiksa, dan waktu yang dibutuhkan untuk setiap tahap. Informasi ini sangat berharga untuk mengidentifikasi apakah indeks tertentu digunakan secara efektif atau jika kueri dapat memperoleh manfaat dari struktur indeks yang berbeda.
explain()
Metode ini dapat dirantai dengan find()
metode ini. explain()
Metode ini dapat mengambil ExplainVerbosity
explain()
Pada saat ini, hanya EXECUTION_STATS
dan QUERY_PLANNER
enumerator yang didukung oleh DocumentDB. Contoh kode berikut menunjukkan cara mendapatkan perencana kueri untuk kueri tertentu:
// Query we want to analyze Document query = new Document() .append("cuisine", "Thai") .append("rating.average", new Document("$gte", 4.0)); Document allPlansExplain = collection.find(query).explain(ExplainVerbosity.QUERY_PLANNER); System.out.println("All Plans Explain:\n" + allPlansExplain.toJson());
Dokumen JSON berikut dikembalikan untuk tingkat verbositas perencana kueri:
{
"queryPlanner": {
"plannerVersion": 1,
"namespace": "ProgGuideData.Restaurants",
"winningPlan": {
"stage": "IXSCAN",
"indexName": "cuisine_idx",
"direction": "forward"
}
},
"serverInfo": {
"host": "guidecluster3",
"port": 27017,
"version": "5.0.0"
},
"ok": 1,
"operationTime": {
"$timestamp": {
"t": 1739221668,
"i": 1
}
}
}
Anda memiliki beberapa opsi untuk memengaruhi atau memaksa Amazon DocumentDB menggunakan indeks tertentu. hintString()
Metode hint()
dan memungkinkan Anda untuk mengganti perilaku pemilihan indeks default pengoptimal kueri dengan secara eksplisit menentukan indeks mana yang harus digunakan untuk kueri. Sementara pengoptimal kueri DocumentDB umumnya membuat pilihan yang baik untuk pemilihan indeks, ada skenario di mana memaksa indeks tertentu melalui hint()
atau hintString()
dapat bermanfaat, seperti ketika berhadapan dengan data miring, atau menguji kinerja indeks.
Contoh kode berikut memaksa penggunaan indeks majemuk “cuisine_features_idx” untuk kueri yang sama yang dijalankan dalam kode di atas:
// Query we want to analyze Document query = new Document() .append("cuisine", "Thai") .append("rating.average", new Document("$gte", 4.0)); List < Document > queryDocs = new ArrayList < > (); collection.find(query).hintString("cuisine_features_idx").forEach(doc - > queryDocs.add(doc));