Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 BYneboUNIQUEpokud 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
titlecontentobou polích s podporou anglického jazyka. Také přiřaďte poli vyšší váhytitle, 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
$metaprojekce spolu stextScorepolem 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
oneaonenebo 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
onepole umístění může být součástí indexu2da pouzeonejiné neprostorové pole může být součástí indexucompound 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ž
$geoWithindotaz selže ve scénářích: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 holesPokud 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 holeskeypole 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
- Seznamte se s osvědčenými postupy indexování pro nejúčinnější výsledky.
- Informace o indexování na pozadí
- Tady se dozvíte, jak pracovat s indexováním textu.
- Tady se dozvíte o indexování zástupných znaků.