Freigeben über


Verwalten der Indizierung in Azure Cosmos DB for MongoDB vCore

GILT FÜR: MongoDB-vCore

Indizes sind Strukturen, die die Datenabrufgeschwindigkeit verbessern, indem schneller Zugriff auf Felder in einer Sammlung ermöglicht wird. Dazu wird ein sortierter Satz von Zeigern auf Daten erstellt, häufig basierend auf Schlüsselfeldern. Azure Cosmos DB for MongoDB vCore verwendet Indizes in verschiedenen Kontexten, einschließlich Abfrage-Pushdown, eindeutige Einschränkungen und Sharding.

Wichtig

Das Feld „_id“ ist das einzige Feld, das standardmäßig indiziert ist, und die maximale Größe des Felds kann 2 KB betragen. Es wird empfohlen, zusätzliche Indizes basierend auf Abfragefiltern und Prädikaten hinzuzufügen, um die Leistung zu optimieren.

Indextypen

Betrachten wir der Einfachheit halber ein Beispiel für eine Bloganwendung mit der folgenden Einrichtung:

  • Datenbankname: cosmicworks
  • Auflistungsname: products

In dieser Beispielanwendung werden Artikel als Dokumente mit der folgenden Struktur gespeichert. In allen später zitierten Beispielen wird die Struktur dieser Sammlung weiter verwendet.

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

Einzelfeldindizes

Einzelfeldindizes speichern Informationen aus einem einzelnen Feld in einer Auflistung. Die Sortierreihenfolge des Einzelfeldindexes ist unerheblich. Das Feld _id bleibt standardmäßig indiziert.

Azure Cosmos DB for MongoDB vCore unterstützt das Erstellen von Indizes für Folgendes:

  • Dokumentfelder auf der obersten Ebene.
  • Eingebettetes Dokument.
  • Felder innerhalb eines eingebetteten Dokuments.

Mit dem folgenden Befehl wird ein Einzelfeldindex für das Feld author erstellt, und der folgende Befehl erstellt ihn im eingebetteten Feld firstName.

use cosmicworks

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

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

Bei einer Abfrage können mehrere Einzelfeldindizes verwendet werden, soweit verfügbar.

Hinweis

Azure Cosmos DB for MongoDB vCore ermöglicht das Erstellen von maximal 64 Indizes für eine Sammlung. Je nach Dienstebene kann auf Anfrage eine Erweiterung auf bis zu 300 Indizes geplant werden.

Zusammengesetzte Indizes

Zusammengesetzte Indizes verbessern die Datenbankleistung, indem effiziente Abfragen und Sortierungen basierend auf mehreren Feldern in Dokumenten ermöglicht werden. Durch diese Optimierung wird die Notwendigkeit reduziert, ganze Sammlungen zu scannen, wodurch der Datenabruf und die Organisation beschleunigt werden.

Der folgende Befehl erstellt einen zusammengesetzten Index für die Felder author und launchDate in umgekehrter Sortierreihenfolge.

use cosmicworks

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

Order der Felder wirkt sich auf die Selektivität oder die Verwendung des Index aus. Die find-Abfrage würde den erstellten Index nicht verwenden.

use cosmicworks

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

Begrenzungen

  • Maximal 32 Felder/Pfade innerhalb eines zusammengesetzten Index.

Partielle Indizes

Indizes mit einem zugeordneten Abfragefilter, der beschreibt, wann ein Ausdruck im Index generiert werden soll.

use cosmicworks

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

Begrenzungen

  • Partielle Indizes unterstützen ORDER BY oder UNIQUE nur, wenn der Filter qualifiziert ist.

Textindizes

Textindizes sind spezielle Datenstrukturen, die textbasierte Abfragen optimieren und so schneller und effizienter machen.

Verwenden Sie die createIndex-Methode mit der text-Option zum Erstellen eines Textindex für das title-Feld.

use cosmicworks;

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

Hinweis

Obwohl Sie nur einen Textindex pro Sammlung definieren können, ermöglicht Ihnen Azure Cosmos DB for MongoDB vCore das Erstellen von Textindizes für mehrere Felder, damit Sie Textsuchen in verschiedenen Feldern in Ihren Dokumenten durchführen können.

Konfigurieren von Textindexoptionen

Bei Textindizes in Azure Cosmos DB for MongoDB vCore gibt es mehrere Optionen zum Anpassen des Verhaltens. Beispielsweise können Sie die Sprache für die Textanalyse angeben, Gewichtungen festlegen, um bestimmte Felder zu priorisieren, und Suchvorgänge ohne Beachtung der Groß-/Kleinschreibung konfigurieren. Hier ist ein Beispiel für das Erstellen eines Textindexes mit Optionen:

  • Erstellen Sie einen Index, um die Suche nach den Feldern title und content mit Unterstützung für die englische Sprache zu unterstützen. Weisen Sie außerdem dem Feld title höhere Gewichtungen zu, um es in den Suchergebnissen zu priorisieren.

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

Hinweis

Wenn ein Client eine Textsuchabfrage mit dem Begriff „Cosmos DB“ ausführt, wird die Bewertung für jedes Dokument in der Auflistung basierend auf dem Vorhandensein und der Häufigkeit des Begriffs in den Feldern „title“ und „content“ berechnet, wobei dem Feld „title“ aufgrund seiner höheren Gewichtung eine höhere Bedeutung beigemessen wird.

Ausführen einer Textsuche mithilfe eines Textindexes

Sobald der Textindex erstellt wurde, können Sie Textsuchen mithilfe des Operators „text“ in Ihren Abfragen durchführen. Der Textoperator verwendet eine Suchzeichenfolge und gleicht sie mit dem Textindex ab, um relevante Dokumente zu finden.

  • Führen Sie eine Textsuche nach dem Ausdruck Cosmos DB aus.

    use cosmicworks
    
    db.products.find(
      { $text: { $search: "Cosmos DB" } }
    )
    
  • Verwenden Sie in einer Abfrage optional den $meta-Projektionsoperator zusammen mit dem textScore-Feld, um die Gewichtung anzuzeigen.

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

Begrenzungen

  • Für eine Auflistung kann nur ein Textindex definiert werden.
  • Textindizes unterstützen einfache Textsuchen und bieten noch keine erweiterten Suchfunktionen wie z. B. reguläre Ausdrücke.
  • Sortiervorgänge können nicht die Sortierung des Textindexes in MongoDB nutzen.
  • „Hint()“ wird in Kombination mit einer Abfrage über den Ausdruck „$text“ nicht unterstützt.
  • Textindizes können relativ groß sein und im Vergleich zu anderen Indextypen viel Speicherplatz belegen.

Platzhalterindizes

Index für ein einzelnes Feld, indiziert alle Pfade unter field, mit Ausnahme anderer Felder, die sich auf derselben Ebene befinden. Für das folgende Beispieldokument gilt beispielsweise:

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

Beim Erstellen eines Index für { "pets.$**": 1 } wird ein Index zu Details und Unterdokumenteigenschaften erstellt, aber kein Index für „familyName“.

Begrenzungen

  • Platzhalterindizes können keine eindeutigen Indizes unterstützen.
  • Platzhalterindizes unterstützen keine Pushdowns von ORDER BY, es sei denn, der Filter enthält nur Pfade, die im Platzhalter vorhanden sind (da sie keine nicht definierten Elemente indizieren).
  • Ein zusammengesetzter Platzhalterindex kann nur one Platzhalterbegriff und one oder mehr Indexbegriffe enthalten. { "pets.$**": 1, “familyName”: 1 }

Räumliche Indizes

Räumliche Indizes unterstützen Abfragen zu Daten, die als GeoJSON-Objekte oder ältere Koordinatenpaare gespeichert sind. Sie können räumliche Indizes verwenden, um die Leistung für Abfragen von Geodaten zu verbessern oder bestimmte räumliche Abfragen auszuführen.

Azure Cosmos DB for MongoDB vCore bietet zwei Arten von räumlichen Indizes:

  • 2dsphere-Indizes, die Abfragen unterstützen, die Geometrie auf einer Kugel interpretieren.
  • 2D-Indizes, die Abfragen unterstützen, die Geometrie auf einer flachen Oberfläche interpretieren.

2D-Indizes

2D-Indizes werden nur mit dem Legacy-Koordinatenpaarformat zum Speichern von Geodaten unterstützt.

Verwenden Sie die createIndex-Methode mit der 2d-Option zum Erstellen eines räumlichen Index für das location-Feld.

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

Begrenzungen

  • Nur ein one-Standortfeld kann Teil des 2d-Index sein, und nur one anderes nicht-räumliches Feld kann Teil des compound 2d-Index db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 }) sein

2dsphere-Indizes

2dsphere-Indizes unterstützen räumliche Abfragen auf einer erdähnlichen Kugel. Sie können sowohl GeoJSON-Objekte als auch Legacy-Koordinatenpaare unterstützen. 2dSphere-Indizes arbeiten mit dem GeoJSON-Format für das Speichern von Daten. Wenn ältere Punkte gefunden werden, werden sie in GeoJSON-Punkte konvertiert.

Verwenden Sie die createIndex-Methode mit der 2dsphere-Option zum Erstellen eines räumlichen Index für das location-Feld.

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

2dsphere-Indizes ermöglichen das Erstellen von Indizes für mehrere räumliche und nicht-räumliche Datenfelder. db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })

Begrenzungen

  • Ein Index, der sich aus einem regulären Index und einem räumlichen Index zusammensetzt, wird nicht unterstützt. Das Erstellen eines der räumlichen Indizes führt zu Fehlern.

    // 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})
    
  • Polygone mit Löchern funktionieren nicht. Das Einfügen eines Polygons mit Loch ist nicht eingeschränkt, auch wenn die $geoWithin-Abfrage für folgende Szenarien fehlschlägt:

    1. Wenn die Abfrage selbst Polygone mit Löchern enthält

      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. Wenn es ein nicht gefiltertes Dokument mit Polygonen mit Löchern gibt.

      [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. Das key-Feld ist bei Verwendung von geoNear obligatorisch.

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

Nächste Schritte