Indexelés kezelése az Azure DocumentDB-ben

Az indexek olyan struktúrák, amelyek a gyűjtemény mezőihez való gyors hozzáférés révén javítják az adatlekérési sebességet. Úgy működnek, hogy rendezett mutatókészletet hoznak létre az adatokhoz, gyakran kulcsmezők alapján. Az Azure DocumentDB több környezetben is használ indexeket, beleértve a lekérdezések leküldését, az egyedi korlátozásokat és a horizontális skálázást.

Important

A "_id" mező az egyetlen mező, amely alapértelmezés szerint indexelt & a mező maximális mérete lehet 2 KB. A teljesítmény optimalizálása érdekében javasoljuk, hogy további indexeket adjon hozzá lekérdezési szűrők és predikátumok alapján.

Indextípusok

Az egyszerűség kedvéért vegyünk egy példát egy blogalkalmazásra az alábbi beállítással:

  • Adatbázis neve: cosmicworks
  • Gyűjtemény neve: products

Ez a példaalkalmazás dokumentumként tárolja a cikkeket az alábbi struktúrával. Az összes idézett példa tovább használja a gyűjtemény struktúráját.

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

Egymezős indexek

Az egymezős indexek egyetlen mezőből tárolnak adatokat egy gyűjteményben. Az egymezős index rendezési sorrendje nem számít. _id a mező alapértelmezés szerint indexelt marad.

Az Azure DocumentDB támogatja az indexek létrehozását az alábbiak szerint

  • Legfelső szintű dokumentummezők.
  • Beágyazott dokumentum.
  • Beágyazott dokumentum mezői.

A következő parancs egyetlen mezőindexet hoz létre a mezőn author , a következő parancs pedig egy beágyazott mezőben firstNamehozza létre.

use cosmicworks

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

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

Egy lekérdezés több egymezős indexet is használhat, ahol elérhető.

Megjegyzés:

Az Azure DocumentDB legfeljebb 64 index létrehozását teszi lehetővé egy gyűjteményen. A szinttől függően igény szerint akár 300 indexet is tervezhetünk.

Összetett indexek

Az összetett indexek hatékonyabbá teszik az adatbázis teljesítményét azáltal, hogy lehetővé teszik a dokumentumok több mezője alapján történő hatékony lekérdezést és rendezést . Ez az optimalizálás csökkenti a teljes gyűjtemények vizsgálatának szükségességét, felgyorsítva az adatlekérést és a szervezést.

Az alábbi parancs összetett indexet hoz létre a mezőkön author és launchDate ellentétes rendezési sorrendben.

use cosmicworks

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

Order mezők befolyásolják az index szelektivitását vagy kihasználtságát. A find lekérdezés nem használja a létrehozott indexet.

use cosmicworks

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

Limitations

  • Egy összetett indexben legfeljebb 32 mező\elérési út lehet.

Részleges indexek

Olyan indexek, amelyek társított lekérdezésszűrővel rendelkeznek, amelyek azt írják le, hogy mikor kell kifejezéseket létrehozni az indexben.

use cosmicworks

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

Limitations

  • A részleges indexek nem támogatják a(z) ORDER BY vagy UNIQUE, hacsak a szűrő nem felel meg.

Szövegindexek

A szöveges indexek speciális adatstruktúrák, amelyek optimalizálják a szövegalapú lekérdezéseket, így gyorsabbak és hatékonyabbak.

Használja a createIndex metódust a text opcióval a title mezőn szövegindex létrehozásához.

use cosmicworks;

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

Megjegyzés:

Bár gyűjteményenként csak egy szöveges indexet definiálhat, az Azure DocumentDB lehetővé teszi, hogy több mező kombinációjával szövegindexeket hozzon létre, amelyekkel szövegkereséseket végezhet a dokumentumok különböző mezőiben.

Szövegindex beállításainak konfigurálása

Az Azure DocumentDB szöveges indexei számos lehetőséget kínálnak a viselkedésük testreszabására. Megadhatja például a szövegelemzés nyelvét, beállíthatja a súlyokat bizonyos mezők rangsorolásához, és konfigurálhatja a kis- és nagybetűket nem érzékelyítő kereséseket. Íme egy példa egy szövegindex beállításokkal való létrehozására:

  • Hozzon létre egy indexet, amely támogatja a keresést az title és content mezőkön, angol nyelvű kereséstámogatással. Emellett rendeljen nagyobb súlyokat a title mezőhöz, hogy rangsorolja azt a keresési eredményekben.

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

Megjegyzés:

Amikor egy ügyfél szöveges keresési lekérdezést végez a "DocumentDB" kifejezéssel, a gyűjtemény minden dokumentumának pontszáma a kifejezés jelenléte és gyakorisága alapján lesz kiszámítva mind a "cím" és a "tartalom" mezőben, mind a nagyobb súly miatt a "cím" mezőben.

Szövegkeresés végrehajtása szövegindex használatával

A szövegindex létrehozása után a lekérdezésekben a "text" operátorral végezhet szöveges keresést. A szövegoperátor egy keresési karakterláncot vesz alapul, és a szövegindex alapján releváns dokumentumokat keres ki.

  • Szövegkeresés végrehajtása a kifejezésre DocumentDB.

    use cosmicworks
    
    db.products.find(
      { $text: { $search: "DocumentDB" } }
    )
    
  • Ha szeretné, a lekérdezésben szereplő mezővel együtt használja a $metatextScore vetítési operátort a súly megjelenítéséhez

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

Limitations

  • Egy gyűjteményben csak egy szöveges index definiálható.
  • A rendezési műveletek nem használhatják a szöveges index sorrendjét a MongoDB-ben.
  • A Hint() nem támogatott olyan lekérdezésekkel, amelyek $text kifejezést használnak.
  • A szövegindexek viszonylag nagy méretűek lehetnek, és jelentős tárterületet foglalnak el más indextípusokhoz képest.

Helyettesítő karakterek indexei

Az egyetlen mező indexelése az összes elérési utat indexeli a field mező alatt, kivéve az azonos szinten lévő többi mezőt. Például a következő mintadokumentumhoz

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

Index létrehozása { "pets.$**": 1 } rendszeren, indexet hoz létre a részletek & aldokumentumtulajdonságok alapján, de nem hoz létre indexet a "familyName" fájlban.

Limitations

  • A helyettesítő indexek nem támogatják az egyedi indexeket.
  • A wildcard indexek csak akkor támogatják a push down folyamatot ORDER BY esetében, ha a szűrő csak a wildcard indexben található elérési utakat tartalmazza, mivel ezek nem indexelik a definiálatlan elemeket.
  • Az összetett helyettesítő karakter index csak egy one helyettesítő kifejezéssel és one vagy több indexkifejezéssel rendelkezhet. { "pets.$**": 1, “familyName”: 1 }

Térinformatikai indexek

A térinformatikai indexek támogatják a GeoJSON-objektumként vagy örökölt koordináta-párként tárolt adatok lekérdezéseit. Térinformatikai indexekkel javíthatja a térinformatikai adatok lekérdezéseinek teljesítményét, vagy futtathat bizonyos térinformatikai lekérdezéseket.

Az Azure DocumentDB kétféle térinformatikai indexet biztosít:

  • 2dsphere indexek, amelyek támogatják a gömb geometriát értelmező lekérdezéseit.
  • 2d Indexek, amelyek támogatják a geometriát egy sík felületen értelmező lekérdezéseket.

Kétdimenziós indexek

A kétdimenziós indexek csak örökölt koordinátapár-stílussal támogatottak a térinformatikai adatok tárolásához.

Használja a createIndex metódust a 2d beállítással térbeli index létrehozásához a location mezőn.

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

Limitations

  • Csak one a hely mező lehet az 2d index része, és csak one más nem térinformatikai mező lehet az compound 2d index része db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })

2dsphere indexek

2dsphere az indexek támogatják a földszerű gömbök térinformatikai lekérdezéseit. Támogatja mind a GeoJSON-objektumokat, mind az örökölt koordináta-párokat. 2dSphere Az indexek az adatok tárolásának GeoJSON-stílusával működnek, ha régi pontokba ütköznek, akkor geojSON-ponttá alakulnak.

Használja a createIndex metódust a 2dsphere beállítással térbeli index létrehozásához a location mezőn.

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

2dsphere Az indexek lehetővé teszik az indexek létrehozását több térinformatikai és több nem térinformatikai adatmezőn. db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })

Limitations

  • A normál indexet és térinformatikai indexet használó összetett indexek nem támogatottak. A térinformatikai indexek bármelyikének létrehozása hibákhoz vezetne.

    // 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})
    
  • A lyukas sokszögek nem működnek. A lyukas sokszög beszúrása nincsen korlátozva, bár $geoWithin a lekérdezés forgatókönyvekben meghiúsul.

    1. Ha magának a lekérdezésnek sokszöge van lyukakkal

      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. Ha van olyan szűretlen dokumentum, amelynek sokszöge lyukas.

      [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 mező megadása kötelező geoNear használatakor.

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

Következő lépések