DocumentDB - Kayıtları İndeksleme
Varsayılan olarak DocumentDB, belge veritabanına eklenir eklenmez belgedeki her özelliği otomatik olarak dizine ekler. Ancak, hiçbir zaman dizine eklenmesi gerekmeyen belirli belgeler ve / veya özellikler olduğunda depolama ve işleme yükünü azaltan kendi dizinleme ilkenizi kontrol edebilir ve ince ayar yapabilirsiniz.
DocumentDB'ye her özelliği otomatik olarak indekslemesini söyleyen varsayılan indeksleme politikası, birçok yaygın senaryo için uygundur. Ancak, tam olarak neyin indeksleneceği ve neyin indekslenmeyeceği ve indeksleme ile ilgili diğer işlevler üzerinde tam kontrol uygulayan özel bir politika da uygulayabilirsiniz.
DocumentDB aşağıdaki indeksleme türlerini destekler -
- Hash
- Range
Hash
Karma indeksi, eşitlik için verimli sorgulama sağlar, yani belirli bir özelliğin tam bir değere eşit olduğu belgeleri ararken, küçüktür, büyüktür veya arasında gibi bir değer aralığında eşleştirme yerine.
Karma dizini ile aralık sorguları gerçekleştirebilirsiniz, ancak DocumentDB eşleşen belgeleri bulmak için karma dizini kullanamayacak ve bunun yerine aralık sorgusu tarafından seçilip seçilmeyeceğini belirlemek için her belgeyi sıralı olarak taraması gerekecektir.
Yalnızca karma dizini olan bir mülkte ORDER BY yan tümcesine sahip belgelerinizi sıralayamazsınız.
Aralık
Özellik için tanımlanan aralık dizini olan DocumentDB, belgeleri bir dizi değere göre verimli bir şekilde sorgulamanıza izin verir. Ayrıca, ORDER BY kullanarak bu özellikteki sorgu sonuçlarını sıralamanıza olanak tanır.
DocumentDB, herhangi bir veya tüm özelliklerde hem bir karma hem de bir aralık dizini tanımlamanıza olanak tanır, bu da verimli eşitlik ve aralık sorgularının yanı sıra ORDER BY sağlar.
Endeksleme Politikası
Her koleksiyonun, her belgenin her özelliğindeki sayılar ve dizeler için hangi tür dizinlerin kullanılacağını belirleyen bir dizinleme ilkesi vardır.
Ayrıca, koleksiyona eklendiklerinde belgelerin otomatik olarak dizine eklenip eklenmeyeceğini de kontrol edebilirsiniz.
Otomatik indeksleme varsayılan olarak etkindir, ancak bir belge eklerken bu davranışı geçersiz kılabilirsiniz ve DocumentDB'ye o belgeyi indekslememesini söyleyebilirsiniz.
Otomatik indekslemeyi devre dışı bırakabilirsiniz, böylece varsayılan olarak, koleksiyona eklendiğinde dokümanlar indekslenmez. Benzer şekilde, bunu belge düzeyinde geçersiz kılabilir ve DocumentDB'ye belirli bir belgeyi koleksiyona eklerken dizine eklemesini söyleyebilirsiniz. Bu, manuel indeksleme olarak bilinir.
İndekslemeyi Dahil Et / Hariç Tut
Bir indeksleme politikası, hangi yol veya yolların indekse dahil edileceğini veya hariç tutulacağını da tanımlayabilir. Bir belgenin asla sorgulamadığınız belirli kısımları ve yaptığınız belirli kısımları olduğunu biliyorsanız, bu yararlıdır.
Bu durumlarda, DocumentDB'ye koleksiyona eklenen her belgenin yalnızca belirli bölümlerini dizine eklemesini söyleyerek dizinleme ek yükünü azaltabilirsiniz.
Otomatik İndeksleme
Otomatik indekslemenin basit bir örneğine bakalım.
Step 1 - İlk olarak otomatik indeksleme adında bir koleksiyon oluşturuyoruz ve açıkça bir politika sağlamadan, bu koleksiyon varsayılan indeksleme politikasını kullanıyor, bu da bu koleksiyonda otomatik indekslemenin etkinleştirildiği anlamına geliyor.
Burada veritabanı kendi kendine bağlantısı için kimlik tabanlı yönlendirme kullanıyoruz, bu nedenle koleksiyonu oluşturmadan önce kaynak kimliğini veya sorgusunu bilmemize gerek yok. Mydb olan veritabanı kimliğini kullanabiliriz.
Step 2 - Şimdi her ikisi de Upston soyadıyla iki belge oluşturalım.
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");
}
Bu, Mark Upston için koleksiyona eklenir ve ardından varsayılan indeksleme politikasına göre hemen otomatik olarak indekslenir.
Ancak Mark Upston için ikinci belge eklendiğinde, koleksiyonun indeksleme politikasına rağmen DocumentDB'ye bu belgeyi indekslememesini açıkça bildiren IndexingDirective.Exclude ile istek seçeneklerini geçtik.
Sonunda her iki belge için de farklı türde sorgularımız var.
Step 3 - CreateDocumentClient'ten AutomaticIndexing görevini çağıralım.
private static async Task CreateDocumentClient() {
// Create a new instance of the DocumentClient
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
await AutomaticIndexing(client);
}
}
Yukarıdaki kod derlenip çalıştırıldığında, aşağıdaki çıktıyı alacaksınız.
**** Override Automatic Indexing ****
Documents WHERE lastName = 'Upston': 1
All documents: 2
Unindexed document self-link: dbs/kV5oAA==/colls/kV5oAOEkfQA=/docs/kV5oAOEkfQACA
AAAAAAAAA==/
Gördüğünüz gibi bu tür iki belgemiz var, ancak sorgu yalnızca Mark için olanı döndürüyor çünkü Mark için olanı dizine eklenmemiş. Koleksiyondaki tüm belgeleri almak için bir WHERE cümlesi olmadan tekrar sorgulama yaparsak, her iki belgeyle birlikte bir sonuç kümesi elde ederiz ve bunun nedeni, indekslenmemiş belgelerin her zaman WHERE yan tümcesi olmayan sorgular tarafından döndürülmesidir.
Ayrıca, indekslenmemiş belgeleri kimliklerine veya kendi kendine bağlantılarına göre alabiliriz. Bu yüzden Mark'ın belgesini MARK kimliğine göre sorguladığımızda DocumentDB'nin koleksiyonda indekslenmemiş olmasına rağmen dokümanı döndürdüğünü görüyoruz.
Manuel Dizin Oluşturma
Otomatik indekslemeyi geçersiz kılarak basit bir manuel indeksleme örneğine bakalım.
Step 1- İlk olarak, manuel indeksleme adlı bir koleksiyon oluşturacağız ve otomatik indekslemeyi açıkça devre dışı bırakarak varsayılan politikayı geçersiz kılacağız. Bu, aksi talep edilmedikçe, bu koleksiyona eklenen yeni belgelerin dizine eklenmeyeceği anlamına gelir.
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- Şimdi yine eskisi gibi aynı iki belgeyi oluşturacağız. Koleksiyonun indeksleme politikası nedeniyle bu sefer Mark'ın dokümanı için herhangi bir özel istek seçeneği sunmayacağız, bu doküman indekslenmeyecek.
Step 3 - Şimdi Mark için ikinci dokümanı eklediğimizde, IndexingDirective ile RequestOptions kullanıyoruz. DocumentDB'ye bu dokümanı indekslemesi gerektiğini söylemek için dahil ediyoruz, bu da koleksiyonun indeksleme politikasını geçersiz kılmaması gerektiğini söylüyor.
Sonunda her iki belge için de farklı türde sorgularımız var.
Step 4 - CreateDocumentClient'ten ManualIndexing görevini çağıralım.
private static async Task CreateDocumentClient() {
// Create a new instance of the DocumentClient
using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
await ManualIndexing(client);
}
}
Yukarıdaki kod derlendiğinde ve çalıştırıldığında, aşağıdaki çıktıyı alacaksınız.
**** Manual Indexing ****
Documents WHERE lastName = 'Upston': 1
All documents: 2
Unindexed document self-link: dbs/kV5oAA==/colls/kV5oANHJPgE=/docs/kV5oANHJPgEBA
AAAAAAAAA==/
Yine, sorgu iki belgeden yalnızca birini döndürür, ancak bu kez, dizine eklenmesini açıkça istediğimiz Jane Doe'yi döndürür. Ancak yine daha önce olduğu gibi, bir WHERE yan tümcesi olmadan sorgulama, Mark için dizine eklenmemiş belge dahil olmak üzere koleksiyondaki tüm belgeleri alır. Dizinlenmemiş belgeyi kimliğine göre de sorgulayabiliriz, bu da DocumentDB'nin dizinlenmemiş olmasına rağmen döndürür.