DocumentDB - Mengindeks Record

Secara default, DocumentDB secara otomatis mengindeks setiap properti dalam dokumen segera setelah dokumen ditambahkan ke database. Namun, Anda dapat mengontrol dan menyesuaikan kebijakan pengindeksan Anda sendiri yang mengurangi penyimpanan dan overhead pemrosesan saat ada dokumen dan / atau properti tertentu yang tidak perlu diindeks.

Kebijakan pengindeksan default yang memberi tahu DocumentDB untuk mengindeks setiap properti secara otomatis cocok untuk banyak skenario umum. Namun Anda juga dapat menerapkan kebijakan khusus yang menjalankan kontrol yang baik atas apa yang sebenarnya diindeks dan apa yang tidak, serta fungsi lain yang berkaitan dengan pengindeksan.

DocumentDB mendukung jenis pengindeksan berikut -

  • Hash
  • Range

Hash

Indeks hash memungkinkan kueri yang efisien untuk persamaan, yaitu, saat mencari dokumen di mana properti yang diberikan sama dengan nilai yang tepat, daripada mencocokkan pada rentang nilai seperti kurang dari, lebih besar dari atau antara.

Anda dapat melakukan kueri rentang dengan indeks hash, tetapi DocumentDB tidak akan dapat menggunakan indeks hash untuk menemukan dokumen yang cocok dan sebagai gantinya perlu memindai setiap dokumen secara berurutan untuk menentukan apakah itu harus dipilih oleh kueri rentang.

Anda tidak akan dapat mengurutkan dokumen Anda dengan klausa ORDER BY pada properti yang hanya memiliki indeks hash.

Jarak

Rentang indeks yang ditentukan untuk properti, DocumentDB memungkinkan untuk meminta dokumen secara efisien terhadap berbagai nilai. Ini juga memungkinkan Anda untuk mengurutkan hasil kueri pada properti itu, menggunakan ORDER BY.

DocumentDB memungkinkan Anda menentukan hash dan indeks rentang pada salah satu atau semua properti, yang memungkinkan persamaan dan rentang kueri yang efisien, serta ORDER BY.

Kebijakan Pengindeksan

Setiap koleksi memiliki kebijakan pengindeksan yang menentukan jenis indeks mana yang digunakan untuk angka dan string di setiap properti setiap dokumen.

  • Anda juga dapat mengontrol apakah dokumen diindeks secara otomatis atau tidak saat ditambahkan ke koleksi.

  • Pengindeksan otomatis diaktifkan secara default, tetapi Anda dapat mengganti perilaku itu saat menambahkan dokumen, memberi tahu DocumentDB agar tidak mengindeks dokumen tertentu itu.

  • Anda dapat menonaktifkan pengindeksan otomatis sehingga secara default, dokumen tidak diindeks saat ditambahkan ke koleksi. Demikian pula, Anda dapat mengganti ini di tingkat dokumen dan menginstruksikan DocumentDB untuk mengindeks dokumen tertentu saat menambahkannya ke koleksi. Ini dikenal sebagai pengindeksan manual.

Sertakan / Kecualikan Pengindeksan

Kebijakan pengindeksan juga dapat menentukan jalur atau jalur mana yang harus disertakan atau dikecualikan dari indeks. Ini berguna jika Anda mengetahui bahwa ada bagian tertentu dari dokumen yang tidak pernah Anda kueri dan bagian tertentu yang Anda lakukan.

Dalam kasus ini, Anda dapat mengurangi overhead pengindeksan dengan memberi tahu DocumentDB untuk mengindeks hanya bagian tertentu dari setiap dokumen yang ditambahkan ke koleksi.

Pengindeksan Otomatis

Mari kita lihat contoh sederhana pengindeksan otomatis.

Step 1 - Pertama kita membuat koleksi yang disebut autoindexing dan tanpa secara eksplisit memberikan kebijakan, koleksi ini menggunakan kebijakan pengindeksan default, yang berarti pengindeksan otomatis diaktifkan pada koleksi ini.

Di sini kami menggunakan perutean berbasis ID untuk tautan mandiri database sehingga kami tidak perlu mengetahui ID sumber dayanya atau kueri untuk itu sebelum membuat koleksi. Kita tinggal menggunakan ID database, yaitu mydb.

Step 2 - Sekarang mari kita buat dua dokumen, keduanya dengan nama belakang Upston.

private async static Task AutomaticIndexing(DocumentClient client) {
   Console.WriteLine();
   Console.WriteLine("**** Override Automatic Indexing ****");

   // Create collection with automatic indexing

   var collectionDefinition = new DocumentCollection {
      Id = "autoindexing"
   };
	
   var collection = await client.CreateDocumentCollectionAsync("dbs/mydb",
      collectionDefinition);

   // Add a document (indexed)
   dynamic indexedDocumentDefinition = new {
      id = "MARK",
      firstName = "Mark",
      lastName = "Upston",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   };
	
   Document indexedDocument = await client
      .CreateDocumentAsync("dbs/mydb/colls/autoindexing", indexedDocumentDefinition);
		
   // Add another document (request no indexing)
   dynamic unindexedDocumentDefinition = new {
      id = "JANE",
      firstName = "Jane",
      lastName = "Upston",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   };
	
   Document unindexedDocument = await client
      .CreateDocumentAsync("dbs/mydb/colls/autoindexing", unindexedDocumentDefinition,
      new RequestOptions { IndexingDirective = IndexingDirective.Exclude });

   //Unindexed document won't get returned when querying on non-ID (or selflink) property

   var doeDocs = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing", "SELECT *
      FROM c WHERE c.lastName = 'Doe'").ToList();
		
   Console.WriteLine("Documents WHERE lastName = 'Doe': {0}", doeDocs.Count);

   // Unindexed document will get returned when using no WHERE clause

   var allDocs = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing",
      "SELECT * FROM c").ToList();
   Console.WriteLine("All documents: {0}", allDocs.Count);
	
   // Unindexed document will get returned when querying by ID (or self-link) property
	
   Document janeDoc = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing",
      "SELECT * FROM c WHERE c.id = 'JANE'").AsEnumerable().FirstOrDefault();
   Console.WriteLine("Unindexed document self-link: {0}", janeDoc.SelfLink);
	
   // Delete the collection
	
   await client.DeleteDocumentCollectionAsync("dbs/mydb/colls/autoindexing");
}

Yang pertama ini, untuk Mark Upston, ditambahkan ke koleksi dan kemudian segera diindeks secara otomatis berdasarkan kebijakan pengindeksan default.

Tetapi ketika dokumen kedua untuk Mark Upston ditambahkan, kami telah meneruskan opsi permintaan dengan IndexingDirective.Exclude yang secara eksplisit menginstruksikan DocumentDB untuk tidak mengindeks dokumen ini, terlepas dari kebijakan pengindeksan koleksi.

Kami memiliki tipe kueri yang berbeda untuk kedua dokumen di bagian akhir.

Step 3 - Mari kita panggil tugas AutomaticIndexing dari CreateDocumentClient.

private static async Task CreateDocumentClient() {
   // Create a new instance of the DocumentClient 
   using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) { 
      await AutomaticIndexing(client); 
   } 
}

Ketika kode di atas dikompilasi dan dijalankan, Anda akan menerima output berikut.

**** Override Automatic Indexing **** 
Documents WHERE lastName = 'Upston': 1 
All documents: 2 
Unindexed document self-link: dbs/kV5oAA==/colls/kV5oAOEkfQA=/docs/kV5oAOEkfQACA 
AAAAAAAAA==/

Seperti yang Anda lihat, kami memiliki dua dokumen seperti itu, tetapi kueri hanya mengembalikan satu untuk Mark karena satu untuk Mark tidak diindeks. Jika kita melakukan query lagi, tanpa klausa WHERE untuk mengambil semua dokumen dalam koleksi, maka kita mendapatkan hasil yang ditetapkan dengan kedua dokumen tersebut dan ini karena dokumen yang tidak terindeks selalu dikembalikan oleh kueri yang tidak memiliki klausa WHERE.

Kami juga dapat mengambil dokumen yang tidak terindeks dengan ID atau tautan mandiri mereka. Jadi ketika kita menanyakan dokumen Mark dengan ID-nya, MARK, kita melihat bahwa DocumentDB mengembalikan dokumen tersebut meskipun tidak diindeks dalam koleksi.

Pengindeksan Manual

Mari kita lihat contoh sederhana pengindeksan manual dengan mengganti pengindeksan otomatis.

Step 1- Pertama kita akan membuat koleksi yang disebut pengindeksan manual dan mengganti kebijakan default dengan menonaktifkan pengindeksan otomatis secara eksplisit. Artinya, kecuali kami meminta sebaliknya, dokumen baru yang ditambahkan ke koleksi ini tidak akan diindeks.

private async static Task ManualIndexing(DocumentClient client) {
   Console.WriteLine();
   Console.WriteLine("**** Manual Indexing ****");
   // Create collection with manual indexing

   var collectionDefinition = new DocumentCollection {
      Id = "manualindexing",
      IndexingPolicy = new IndexingPolicy {
         Automatic = false,
      },
   };
	
   var collection = await client.CreateDocumentCollectionAsync("dbs/mydb",
      collectionDefinition);
		
   // Add a document (unindexed)
   dynamic unindexedDocumentDefinition = new {
      id = "MARK",
      firstName = "Mark",
      lastName = "Doe",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   }; 
	
   Document unindexedDocument = await client
      .CreateDocumentAsync("dbs/mydb/colls/manualindexing", unindexedDocumentDefinition);
  
   // Add another document (request indexing)
   dynamic indexedDocumentDefinition = new {
      id = "JANE",
      firstName = "Jane",
      lastName = "Doe",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   };
	
   Document indexedDocument = await client.CreateDocumentAsync
      ("dbs/mydb/colls/manualindexing", indexedDocumentDefinition, new RequestOptions {
      IndexingDirective = IndexingDirective.Include });

   //Unindexed document won't get returned when querying on non-ID (or selflink) property

   var doeDocs = client.CreateDocumentQuery("dbs/mydb/colls/manualindexing",
      "SELECT * FROM c WHERE c.lastName = 'Doe'").ToList();
   Console.WriteLine("Documents WHERE lastName = 'Doe': {0}", doeDocs.Count);
	
   // Unindexed document will get returned when using no WHERE clause
	
   var allDocs = client.CreateDocumentQuery("dbs/mydb/colls/manualindexing",
      "SELECT * FROM c").ToList();
   Console.WriteLine("All documents: {0}", allDocs.Count);
	
   // Unindexed document will get returned when querying by ID (or self-link) property
	
   Document markDoc = client
      .CreateDocumentQuery("dbs/mydb/colls/manualindexing",
      "SELECT * FROM c WHERE c.id = 'MARK'")
      .AsEnumerable().FirstOrDefault();
   Console.WriteLine("Unindexed document self-link: {0}", markDoc.SelfLink);
   await client.DeleteDocumentCollectionAsync("dbs/mydb/colls/manualindexing");
}

Step 2- Sekarang kita akan kembali membuat dua dokumen yang sama seperti sebelumnya. Kami tidak akan menyediakan opsi permintaan khusus apa pun untuk dokumen Mark kali ini, karena kebijakan pengindeksan koleksi, dokumen ini tidak akan diindeks.

Step 3 - Sekarang ketika kami menambahkan dokumen kedua untuk Mark, kami menggunakan RequestOptions dengan IndexingDirective.Include untuk memberi tahu DocumentDB bahwa ia harus mengindeks dokumen ini, yang menggantikan kebijakan pengindeksan koleksi yang mengatakan bahwa seharusnya tidak.

Kami memiliki tipe kueri yang berbeda untuk kedua dokumen di bagian akhir.

Step 4 - Mari kita panggil tugas ManualIndexing dari CreateDocumentClient.

private static async Task CreateDocumentClient() {
   // Create a new instance of the DocumentClient 
   using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
      await ManualIndexing(client); 
   } 
}

Ketika kode di atas dikompilasi dan dijalankan, Anda akan menerima output berikut.

**** Manual Indexing **** 
Documents WHERE lastName = 'Upston': 1 
All documents: 2 
Unindexed document self-link: dbs/kV5oAA==/colls/kV5oANHJPgE=/docs/kV5oANHJPgEBA 
AAAAAAAAA==/

Sekali lagi, kueri hanya mengembalikan satu dari dua dokumen, tetapi kali ini, mengembalikan Jane Doe, yang secara eksplisit kami minta untuk diindeks. Tapi sekali lagi seperti sebelumnya, kueri tanpa klausa WHERE mengambil semua dokumen dalam koleksi, termasuk dokumen yang tidak terindeks untuk Mark. Kita juga bisa meminta dokumen yang tidak terindeks berdasarkan ID-nya, yang dikembalikan DocumentDB meskipun tidak diindeks.