Sdílet prostřednictvím


Správa indexování ve službě Azure Cosmos DB pro virtuální jádro MongoDB

PLATÍ PRO: Virtuální jádro MongoDB

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 Cosmos DB pro virtuální jádro MongoDB využívá indexy v několika kontextech, včetně odesílání dotazů, jedinečných omezení a horizontálního dělení.

Důležité

Pole "_id" je ve výchozím nastavení jediné indexované pole 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 Cosmos DB - A Game Changer",
  "content": "Azure Cosmos DB 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é.

Virtuální jádro Služby Azure Cosmos DB pro MongoDB podporuje vytváření indexu na následující adrese:

  • 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 Cosmos DB pro mongoDB vCore 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 pole 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 createIndex text 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, virtuální jádro služby Azure Cosmos DB pro MongoDB umožňuje vytvářet textové indexy v 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 ve službě Azure Cosmos DB pro virtuální jádro MongoDB 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 title content 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 "Cosmos DB", skóre pro každý dokument v kolekci se vypočítá na základě přítomnosti a frekvence termínu v polích "title" a "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 Cosmos DB.

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

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

Omezení

  • V kolekci lze definovat pouze jeden textový index.
  • Textové indexy podporují jednoduché vyhledávání textu a zatím neposkytují pokročilé možnosti vyhledávání, jako jsou regulární výrazy.
  • 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 znaménky nepodporují nabízení ORDER BY změn, pokud filtr neobsahuje pouze cesty, které jsou v zástupné znaméně (protože neindexují nedefinované elementy).
  • Složený index zástupných znaků může obsahovat one pouze zástupný znak a one nebo více termínů indexu. { "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.

Virtuální jádro Služby Azure Cosmos DB pro MongoDB poskytuje dva typy geoprostorových indexů:

  • 2dsphere Indexy, které podporují dotazy, které interpretují geometrii na kouli.
  • 2d Indexy, které podporují dotazy, které interpretují geometrii na plochém povrchu.

2d indexy

2d indexy jsou podporovány pouze se starší verzí stylu páru souřadnic ukládání geoprostorových dat.

Použijte metodu createIndex 2d 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 zemskou kouli. Může podporovat jak objekty GeoJSON, tak starší dvojice souřadnic. 2dSphere indexy pracují se stylem GeoJSON ukládání dat, pokud jsou zjištěny starší body, pak by se převedly na bod GeoJSON.

Použijte metodu createIndex 2dsphere 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