Sdílet prostřednictvím


Správa indexování v Azure DocumentDB

Indexy jsou struktury, které zlepšují rychlost načítání dat tím, že poskytují rychlý přístup k polím v kolekci. Pracují vytvořením uspořádané sady ukazatelů na data, často na základě klíčových polí. Azure DocumentDB využívá indexy v několika kontextech, včetně potlačení dotazů, jedinečných omezení a horizontální fragmentace.

Důležité

Pole "_id" je jediné pole indexované ve výchozím nastavení a maximální velikost pole může být 2 KB. Doporučujeme přidat další indexy na základě filtrů dotazů a predikátů pro optimalizaci výkonu.

Typy indexů

Pro zjednodušení se podívejme na příklad aplikace blogu s následujícím nastavením:

  • Název databáze: cosmicworks
  • Název kolekce: products

Tato ukázková aplikace ukládá články jako dokumenty s následující strukturou. Všechny příklady dále využívají strukturu této kolekce.

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

Indexy s jedním polem

Indexy s jedním polem ukládají informace z jednoho pole v kolekci. Pořadí řazení indexu s jedním polem nezáleží. _id pole zůstane ve výchozím nastavení indexované.

Azure DocumentDB podporuje vytváření indexu následujícím postupem:

  • Pole dokumentu nejvyšší úrovně
  • Vložený dokument.
  • Pole v rámci vloženého dokumentu.

Následující příkaz vytvoří v poli author jeden index pole a následující příkaz ho vytvoří v vloženém poli firstName.

use cosmicworks

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

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

Jeden dotaz může použít více indexů s jedním polem, pokud je k dispozici.

Poznámka:

Azure DocumentDB umožňuje vytvořit v kolekci maximálně 64 indexů. V závislosti na úrovni můžeme na vyžádání naplánovat rozšíření až 300 indexů.

Složené indexy

Složené indexy zlepšují výkon databáze tím, že umožňují efektivní dotazování a řazení na základě více polí v dokumentech. Tato optimalizace snižuje potřebu prohledávat celé kolekce a urychlit načítání dat a organizaci.

Následující příkaz vytvoří složený index polí author a launchDate v opačném pořadí řazení.

use cosmicworks

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

Order polí ovlivňují selektivitu nebo využití indexu. Dotaz find nevyužil vytvořený index.

use cosmicworks

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

Omezení

  • Maximálně 32 polí\cest v rámci složeného indexu.

Částečné indexy

Indexy s přidruženým filtrem dotazu, který popisuje, kdy se má v indexu vygenerovat termín.

use cosmicworks

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

Omezení

  • Částečné indexy nepodporují ORDER BY nebo UNIQUE pokud filtr nesplňuje požadavky.

Textové indexy

Textové indexy jsou speciální datové struktury, které optimalizují textové dotazy, což je rychlejší a efektivnější.

Použijte metodu createIndextext s možností pro vytvoření textového indexu v title poli.

use cosmicworks;

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

Poznámka:

I když můžete definovat pouze jeden textový index na kolekci, Azure DocumentDB umožňuje vytvářet textové indexy na kombinaci více polí, abyste mohli provádět vyhledávání textu v různých polích v dokumentech.

Konfigurace možností indexu textu

Textové indexy v Azure DocumentDB mají několik možností přizpůsobení jejich chování. Můžete například zadat jazyk pro analýzu textu, nastavit váhy pro stanovení priority určitých polí a nakonfigurovat vyhledávání bez rozlišování velkých a malých písmen. Tady je příklad vytvoření textového indexu s možnostmi:

  • Vytvořte index, který podporuje vyhledávání v titlecontent obou polích s podporou anglického jazyka. Také přiřaďte poli vyšší váhy title , aby bylo možné určit prioritu ve výsledcích hledání.

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

Poznámka:

Když klient provede textový vyhledávací dotaz s termínem DocumentDB, bude skóre pro každý dokument v kolekci vypočítáno na základě přítomnosti a frekvence termínu v polích "title" i "content" s vyšší důležitostí vzhledem k jeho vyšší hmotnosti.

Hledání textu pomocí textového indexu

Po vytvoření textového indexu můžete v dotazech provádět vyhledávání textu pomocí operátoru "text". Textový operátor vezme hledaný řetězec a porovná ho s textovým indexem k vyhledání relevantních dokumentů.

  • Proveďte textové hledání fráze DocumentDB.

    use cosmicworks
    
    db.products.find(
      { $text: { $search: "DocumentDB" } }
    )
    
  • Volitelně můžete pomocí operátoru $meta projekce spolu s textScore polem v dotazu zobrazit váhu.

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

Omezení

  • V kolekci lze definovat pouze jeden textový index.
  • Operace řazení nemůžou používat řazení textového indexu v MongoDB.
  • Hint() není podporován v kombinaci s dotazem pomocí výrazu $text.
  • Textové indexy můžou být relativně velké a ve srovnání s jinými typy indexů spotřebovávají významný prostor úložiště.

Indexy se zástupnými cardy

Indexuje u jednoho pole všechny cesty pod položkou field , s výjimkou jiných polí, která jsou na stejné úrovni. Například pro následující ukázkový dokument

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

Vytvoření indexu pro { "pets.$**": 1 }, vytvoří index s podrobnostmi a vlastnostmi vnořeného dokumentu, ale nevytvoří index pro familyName.

Omezení

  • Zástupné indexy nemůžou podporovat jedinečné indexy.
  • Indexy se zástupnými znaky nepodporují propouštění ORDER BY (pokud filtr neobsahuje pouze cesty, které jsou přítomny v zástupném znaku), protože neindexují nedefinované prvky.
  • Složený index zástupných znaků může obsahovat pouze jeden zástupný termín one a one nebo více indexových termínů. { "pets.$**": 1, “familyName”: 1 }

Geoprostorové indexy

Geoprostorové indexy podporují dotazy na data uložená jako objekty GeoJSON nebo starší dvojice souřadnic. Pomocí geoprostorových indexů můžete zlepšit výkon dotazů na geoprostorová data nebo spouštět určité geoprostorové dotazy.

Azure DocumentDB poskytuje dva typy geoprostorových indexů:

  • 2dsphere indexy, které podporují dotazy interpretující geometrii na sféře.
  • 2d Indexy, které podporují dotazy, které interpretují geometrii na plochém povrchu.

2D indexy

2d indexy jsou podporovány pouze se starším způsobem párování souřadnic při ukládání geoprostorových dat.

Použijte metodu createIndex2d s možností vytvoření geoprostorového indexu v location poli.

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

Omezení

  • Pouze one pole umístění může být součástí indexu 2d a pouze one jiné neprostorové pole může být součástí indexu compound 2d . db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })

2dsphere indexy

2dsphere indexy podporují geoprostorové dotazy na kouli podobné Zemi. Může podporovat jak objekty GeoJSON, tak starší dvojice souřadnic. 2dSphere indexy pracují se stylem ukládání dat GeoJSON, když jsou zjištěny starší body, převedou se na bod GeoJSON.

Použijte metodu createIndex2dsphere s možností vytvoření geoprostorového indexu v location poli.

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

2dsphere indexy umožňují vytvářet indexy pro více geoprostorových a více neprostorových datových polí. db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })

Omezení

  • Složený index používající běžný index a geoprostorový index se nepodporuje. Vytvoření některého z geoprostorových indexů by vedlo k chybám.

    // 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})
    
  • Mnohoúhelníky s otvory nefungují. Vložení polygonu s dírou není omezené, i když $geoWithin dotaz selže ve scénářích:

    1. Pokud má samotný dotaz mnohoúhelník s otvory

      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. Pokud je nějaký nefiltrovaný dokument, který obsahuje mnohoúhelník s otvory.

      [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 pole je při použití geoNearpovinné .

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

Další kroky