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
neboUNIQUE
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á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 "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 stextScore
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 aone
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í indexu2d
a pouzeone
jiné 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 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: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
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
key
pole je při použitígeoNear
povinné .[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ů.