View a markdown version of this page

Manajemen indeks di Amazon DocumentDB dengan Java - Amazon DocumentDB

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 secara 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, melepas, dan membuat daftar indeks menggunakan driver MongoDB Java. Ini juga membahas cara 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 Cara mengindeks di Amazon DocumentDB di Blog AWS Database.

Membuat indeks dengan Java

Ada dua mekanisme untuk membuat indeks di Amazon DocumentDB menggunakan driver MongoDB Java: melaluirunCommand(), dan dengan createIndex() metode untuk indeks tunggal atau createIndexes() metode untuk beberapa indeks. Salah satu alasan untuk menggunakan createIndexes() metode createIndex() dan adalah Anda dapat membangun penanganan kesalahan yang lebih baik dengan menangkap kesalahan spesifik 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 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 mencakup pengaturan untuk indeks unik, indeks jarang, waktu kedaluwarsa (TTL), dan ekspresi filter parSIAL. Melalui rantai metode, Anda dapat mengonfigurasi beberapa opsi seperti pembuatan indeks latar belakang dan batasan unik.

Buat indeks tunggal

Contoh ini menunjukkan cara membuat indeks tunggal menggunakan metodecreateIndex() di latar belakang. Untuk memahami pembuatan indeks latar belakang dan latar depan, lihatJenis pembuatan indeks. Contoh kode berikut digunakan IndexOptions untuk membuat indeks unik dengan nama “unique_restaurantId_idx” di latar belakang. Ob IndexOptions jek 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 pertama membangun opsi untuk setiap indeks dengan menggunakan IndexModel objek dan kemudian meneruskan daftar IndexModel objek ke createIndexes() metode. Contoh kode berikut menunjukkan cara membuat indeks komposit dengan menggunakan kelas Indexes utilitas. Kelas ini juga digunakan untuk menentukan apakah Anda ingin membuat indeks menggunakan urutan menaik atau menurun. Setelah membuat beberapa indeks, itu memverifikasi pembuatan indeks dengan memanggil metode. 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 sparse dan sebagian dengan membuat IndexModel untuk setiap jenis indeks.

// 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 majemuk yang mencakup beberapa bidang. Saat menggunakan beberapa bidang dalam indeks teks, Anda juga dapat menetapkan bobot untuk setiap 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. Untuk informasi selengkapnya, lihat Membuka kekuatan pengindeksan paralel di Amazon DocumentDB di Blog AWS Database. Saat ini, driver MongDB Java tidak mendukung menentukan opsi pekerja saat Anda menggunakan createIndex() 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);

Menurunkan indeks

Driver MongoDB Java menyediakan beberapa metode untuk menurunkan indeks, melayani berbagai skenario dan preferensi Anda. Anda dapat menghapus indeks berdasarkan nama, dengan spesifikasi kunci, atau menghapus semua indeks sekaligus. Metode dropIndex() dan dropIndexes() dapat dipanggil pada objek koleksi untuk melepaskan indeks. Saat menjatuhkan indeks berdasarkan nama, Anda harus memastikan mereka menggunakan nama indeks yang benar yang mungkin tidak selalu intuitif, terutama untuk indeks majemuk atau yang dibuat secara otomatis. Mencoba menurunkan indeks yang tidak ada akan menghasilkan a MongoCommandException. default _idIndeks tidak dapat dijatuhkan karena memastikan keunikan dokumen dalam koleksi.

Contoh kode berikut menunjukkan cara menghapus indeks dengan memberikan nama bidang tempat 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 majemuk 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 melepaskan kunci majemuk itu tetapi urutannya bukan yang digunakan untuk pembuatan, maka MongoCommnadException kesalahan terjadi 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 penjelasan 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 terperinci tentang rencana kueri, termasuk indeks mana, jika ada, yang 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. explain()Metode ini dapat mengambil ExplainVerbosity enum opsional yang menentukan tingkat verbositas yang dikembalikan oleh. 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 mempengaruhi 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. Meskipun 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));