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 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 ini.

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 IndexOptionsuntuk membuat indeks unik dengan nama “Unique_Restaurantid_IDX” di latar belakang. IndexOptionsObjek 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 IndexModelobjek dan kemudian melewati daftar IndexModel objek ke createIndexes() metode. Contoh kode berikut menunjukkan cara membuat indeks komposit dengan menggunakan kelas Indexesutilitas. Kelas ini juga digunakan untuk menentukan apakah Anda ingin membuat indeks menggunakan urutan urutan naik atau turun. 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 jarang dan sebagian dengan membuat IndexModeluntuk 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 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 blog ini memberikan diskusi mendalam tentang pengindeksan paralel. 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);

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 _idIndeks 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 ExplainVerbosityenum 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 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));