Bagikan melalui


Mengelola pengindeksan di Azure DocumentDB

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 BY atau UNIQUE kecuali 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 title bidang dan content dengan dukungan bahasa Inggris. Selain itu, tetapkan bobot yang lebih tinggi ke title bidang 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 $meta operator proyeksi bersama dengan textScore bidang dalam kueri untuk melihat bobot

    use 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 BY tidak 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 one istilah kartubebas dan one atau 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 one bidang lokasi yang dapat menjadi bagian 2d dari indeks dan hanya one bidang non-geospasial lainnya yang dapat menjadi bagian compound 2d dari indeks db.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 $geoWithin kueri gagal untuk skenario:

    1. 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 holes
      
    2. Jika 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 holes
      
    3. key bidang wajib saat menggunakan geoNear.

       [mongos] test> coll.aggregate([{ $geoNear: { $near: { "type": "Point", coordinates: [0, 0] } } }])
      
       // MongoServerError: $geoNear requires a 'key' option as a String
      

Langkah selanjutnya