Aracılığıyla paylaş


Azure DocumentDB'de dizin oluşturmayı yönetme

Dizinler, bir koleksiyondaki alanlara hızlı erişim sağlayarak veri alma hızını geliştiren yapılardır. Genellikle anahtar alanlarına göre sıralı bir veri işaretçileri kümesi oluşturarak çalışırlar. Azure DocumentDB, sorguyu aşağı gönderme, benzersiz kısıtlamalar ve parçalama dahil olmak üzere birden çok bağlamda dizinleri kullanır.

Önemli

"_id" alanı, varsayılan olarak dizine alınan tek alan ve alanın en büyük boyutu olabilir 2 KB. Performansı iyileştirmek için sorgu filtrelerini ve koşullarını temel alan ek dizinler eklemeniz önerilir.

Dizin türleri

Kolaylık olması için aşağıdaki kuruluma sahip bir blog uygulaması örneğini ele alalım:

  • Veritabanı adı: cosmicworks
  • Koleksiyon adı: products

Bu örnek uygulama, makaleleri aşağıdaki yapıya sahip belgeler olarak depolar. Alıntılanan tüm örnek bu koleksiyonun yapısını daha da kullanır.

{
  "_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
}

Tek alan dizinleri

Tek alan dizinleri, koleksiyondaki tek bir alandaki bilgileri depolar. Tek alan dizininin sıralama düzeni önemli değildir. _id alanı varsayılan olarak dizine eklenir.

Azure DocumentDB şu anda dizin oluşturmayı destekler

  • Üst düzey belge alanları.
  • Eklenmiş belge.
  • Eklenmiş belge içindeki alanlar.

Aşağıdaki komut alanda author tek bir alan dizini oluşturur ve aşağıdaki komut bunu eklenmiş bir alanda firstNameoluşturur.

use cosmicworks

db.products.createIndex({"author": 1})

// indexing embedded property
db.products.createIndex({"author.firstName": -1})

Bir sorgu, kullanılabilir durumda birden çok tek alan dizini kullanabilir.

Uyarı

Azure DocumentDB, bir koleksiyonda en fazla 64 dizin oluşturulmasına olanak tanır. Talep üzerine, katmana bağlı olarak 300 dizine kadar genişletme planlayabiliriz.

Bileşik dizinler

Bileşik dizinler, belgelerdeki birden çok alana göre verimli sorgulama ve sıralamaya olanak tanıyarak veritabanı performansını geliştirir. Bu iyileştirme, tüm koleksiyonları tarama gereksinimini azaltarak veri alma ve düzenlemeyi hızlandırıyor.

Aşağıdaki komut, alanlarda author ve launchDate karşıt sıralama düzeninde bir bileşik dizin oluşturur.

use cosmicworks

db.products.createIndex({"author":1, "launchDate":-1})

Order alanların özellikleri, dizinin seçiciliğini veya kullanımını etkiler. Sorgu, find oluşturulan dizini kullanmaz.

use cosmicworks

db.products.find({"launchDate": {$gt: ISODate("2024-06-01T00:00:00.000Z")}})

Sınırlamalar

  • Bileşik dizin içinde en fazla 32 alan\yol.

Kısmi dizinler

Dizinde bir terimin ne zaman oluşturulacağıyla ilgili bir sorgu filtresine sahip dizinler.

use cosmicworks

db.products.createIndex (
   { "author": 1, "launchDate": 1 },
   { partialFilterExpression: { "launchDate": { $gt: ISODate("2024-06-24T10:08:20.000Z") } } }
)

Sınırlamalar

  • Kısmi dizinler, filtre uygun olmadıkça ORDER BY veya UNIQUE desteklemez.

Metin dizinleri

Metin dizinleri, metin tabanlı sorguları iyileştirerek daha hızlı ve verimli hale getiren özel veri yapılarıdır.

createIndex alanında metin dizini text oluşturma seçeneğiyle title yöntemini kullanın.

use cosmicworks;

db.products.createIndex({ title: "text" })

Uyarı

Koleksiyon başına yalnızca bir metin dizini tanımlayabilirsiniz ancak Azure DocumentDB, belgelerinizdeki farklı alanlarda metin aramaları yapmanıza olanak tanımak için birden çok alanın birleşiminde metin dizinleri oluşturmanıza olanak tanır.

Metin dizini seçeneklerini yapılandırma

Azure DocumentDB'deki metin dizinleri, davranışlarını özelleştirmek için çeşitli seçeneklerle birlikte gelir. Örneğin, metin analizi dilini belirtebilir, belirli alanların önceliğini belirlemek için ağırlıkları ayarlayabilir ve büyük/küçük harfe duyarlı olmayan aramaları yapılandırabilirsiniz. Aşağıda seçenekler içeren bir metin dizini oluşturma örneği verilmişti:

  • İngilizce dil desteğine sahip ve titlecontent alanlarında aramayı desteklemek için bir dizin oluşturun. Ayrıca, arama sonuçlarında önceliklerini belirlemek için alana daha yüksek ağırlıklar title atayın.

    use cosmicworks
    
    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

Uyarı

İstemci "DocumentDB" terimiyle bir metin arama sorgusu gerçekleştirdiğinde, koleksiyondaki her belgenin puanı hem "başlık" hem de "içerik" alanlarındaki terimin varlığı ve sıklığına göre hesaplanır ve daha yüksek ağırlığı nedeniyle "başlık" alanına daha yüksek önem verilir.

Metin dizini kullanarak metin araması yapma

Metin dizini oluşturulduktan sonra, sorgularınızdaki "text" işlecini kullanarak metin aramaları yapabilirsiniz. Metin işleci bir arama dizesi alır ve ilgili belgeleri bulmak için bu dizeyi metin diziniyle eşleştirir.

  • tümceciği DocumentDBiçin metin araması yapın.

    use cosmicworks
    
    db.products.find(
      { $text: { $search: "DocumentDB" } }
    )
    
  • İsteğe bağlı olarak, ağırlığı görmek için sorguda $meta projeksiyon işlecini ve textScore alanını birlikte kullanın.

    use cosmicworks
    
    db.products.find(
    { $text: { $search: "DocumentDB" } },
    { score: { $meta: "textScore" } }
    )
    

Sınırlamalar

  • Bir koleksiyonda yalnızca bir metin dizini tanımlanabilir.
  • Sıralama işlemleri MongoDB'de metin dizininin sıralamasını kullanamaz.
  • Hint(), $text ifadesi kullanan bir sorguyla birlikte desteklenmez.
  • Metin dizinleri görece büyük olabilir ve diğer dizin türlerine kıyasla önemli depolama alanı tüketebilir.

Joker Karakter dizinleri

Tek bir alanda dizin oluşturur, aynı düzeydeki diğer alanları hariç tutarak altındaki field tüm yolları dizinler. Örneğin, aşağıdaki örnek belge için

{
 "children":
    {
     "familyName": "Merriam",
     "pets": { "details": {“name”: "Goofy", ”age”: 3} }
   } 
}

{ "pets.$**": 1 } üzerinde dizin oluşturma, ayrıntılar ve alt belge özelliklerinde dizin oluşturur ancak "familyName" üzerinde dizin oluşturmaz.

Sınırlamalar

  • Joker dizinler benzersiz dizinleri destekleyemez.
  • Joker karakter dizinleri, yalnızca joker karakterde bulunan yolların filtreye dahil edilmesi durumunda ORDER BY öğesinin gönderimini destekler, çünkü tanımlanmamış öğelerin dizinini oluşturmazlar.
  • Bileşik joker dizini yalnızca bir one joker karakter terimi ve one veya daha fazla dizin terimi içerebilir. { "pets.$**": 1, “familyName”: 1 }

Jeo-uzamsal dizinler

Jeo-uzamsal dizinler, GeoJSON nesneleri veya eski koordinat çiftleri olarak depolanan veriler üzerindeki sorguları destekler. Jeo-uzamsal verilerdeki sorguların performansını artırmak veya belirli jeo-uzamsal sorguları çalıştırmak için jeo-uzamsal dizinleri kullanabilirsiniz.

Azure DocumentDB iki tür jeo-uzamsal dizin sağlar:

  • Bir küredeki geometriyi yorumlayan sorguları destekleyen 2dsphere Dizinleri.
  • Düz bir yüzeydeki geometriyi yorumlayan sorguları destekleyen 2b Dizinler.

2d dizinler

2d dizinler yalnızca coğrafi verilerin eski koordinat çifti stiliyle depolanma yöntemiyle desteklenir.

2d seçeneğiyle createIndex yöntemini kullanarak location alanında jeo-uzamsal dizin oluşturun.

db.places.createIndex({ "location": "2d"});

Sınırlamalar

  • Yalnızca one konum alanı dizinin parçası 2d olabilir ve yalnızca one diğer jeo-uzamsal olmayan alan dizinin parçası compound 2d olabilir db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })

2dsphere dizinleri

2dsphere dizinler, dünya benzeri bir alanda jeo-uzamsal sorguları destekler. Hem GeoJSON nesnelerini hem de eski koordinat çiftlerini destekleyebilir. 2dSphere dizinleri verileri depolamanın GeoJSON stiliyle çalışır; eski noktalarla karşılaşılırsa GeoJSON noktasına dönüştürülür.

createIndex yöntemini 2dsphere seçeneğiyle location alanında jeo-uzamsal dizin oluşturmak için kullanın.

db.places.createIndex({ "location": "2dsphere"});

2dsphere dizinler, birden çok jeo-uzamsal ve birden çok jeo-uzamsal olmayan veri alanında dizinler oluşturulmasına olanak sağlar. db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })

Sınırlamalar

  • Normal dizin ve jeo-uzamsal dizin kullanan bileşik dizin desteklenmez. Jeo-uzamsal dizinlerden birinin oluşturulması hatalara yol açabilir.

    // 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})
    
  • Delikli çokgenler çalışmaz. tr-TR: İç boşluğu olan bir çokgen eklemek kısıtlanmasa da $geoWithin sorgusu bazı senaryolarda başarısız olur.

    1. Sorgunun kendisinde delikli çokgen varsa

      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. Herhangi bir filtrelenmemiş belge içinde delikleri olan bir çokgen varsa.

      [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 alanı kullanılırken geoNearzorunludur.

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

Sonraki Adımlar