Freigeben über


Verwalten der Indizierung in Azure DocumentDB

Indizes sind Strukturen, die die Datenempfangsgeschwindigkeit verbessern, indem der schnelle Zugriff auf Felder in einer Auflistung ermöglicht wird. Sie arbeiten, indem sie einen sortierten Satz von Zeigern auf Daten erstellen, häufig basierend auf Schlüsselfeldern. Azure DocumentDB verwendet Indizes in mehreren Kontexten, einschließlich Abfrage-Pushdown, eindeutige Einschränkungen und Sharding.

Von Bedeutung

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

Indextypen

Lassen Sie uns aus Gründen der Einfachheit ein Beispiel für eine Bloganwendung mit der folgenden Einrichtung betrachten:

  • Datenbankname: cosmicworks
  • Sammlungsname: products

In dieser Beispielanwendung werden Artikel als Dokumente mit der folgenden Struktur gespeichert. Alle weiter angeführten Beispiele nutzen die Struktur dieser Sammlung.

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

Einzelfeldindizes

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

Azure DocumentDB unterstützt das Erstellen von Index wie folgt:

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

Mit dem folgenden Befehl wird ein einzelner Feldindex für das Feld author erstellt, und der folgende Befehl erstellt ihn in einem eingebetteten Feld firstName.

use cosmicworks

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

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

Eine Abfrage kann mehrere einzelne Feldindizes verwenden, sofern verfügbar.

Hinweis

Azure DocumentDB ermöglicht das Erstellen von maximal 64 Indizes für eine Auflistung. Abhängig von der Stufe können wir auf Anfrage eine Erweiterung auf bis zu 300 Indizes planen.

Zusammengesetzte Indizes

Zusammengesetzte Indizes verbessern die Datenbankleistung, indem sie eine effiziente Abfrage und Sortierung basierend auf mehreren Feldern innerhalb von Dokumenten ermöglichen. Durch diese Optimierung wird die Notwendigkeit reduziert, ganze Sammlungen zu scannen und den Datenabruf und die Organisation zu beschleunigen.

Mit dem folgenden Befehl wird ein zusammengesetzter Index für die Felder author und launchDate in entgegengesetzter Sortierreihenfolge erstellt.

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")}})

Einschränkungen

  • Maximal 32 Felder\Pfade innerhalb eines zusammengesetzten Indexes.

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") } } }
)

Einschränkungen

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

Textindizes

Textindizes sind spezielle Datenstrukturen, die textbasierte Abfragen optimieren, wodurch sie schneller und effizienter werden.

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

use cosmicworks;

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

Hinweis

Obwohl Sie nur einen Textindex pro Sammlung definieren können, können Sie in Azure DocumentDB Textindizes in Kombination mit mehreren Feldern erstellen, damit Sie Textsuchen in verschiedenen Feldern in Ihren Dokumenten ausführen können.

Konfigurieren von Textindexoptionen

Textindizes in Azure DocumentDB verfügen über mehrere Optionen zum Anpassen ihres Verhaltens. Sie können z. B. die Sprache für die Textanalyse angeben, Gewichtungen festlegen, um bestimmte Felder zu priorisieren, und die Suche ohne Berücksichtigung von Groß- und Kleinschreibung konfigurieren. Hier ist ein Beispiel für das Erstellen eines Textindexes mit Optionen:

  • Erstellen Sie einen Index, um die Suche in den title Feldern und content Feldern mit Unterstützung für englischen Sprachen zu unterstützen. Weisen Sie dem title Feld außerdem höhere Gewichtungen zu, um es in 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 "DocumentDB" ausführt, wird die Bewertung für jedes Dokument in der Auflistung basierend auf dem Vorhandensein und der Häufigkeit des Ausdrucks sowohl in den Feldern "Title" als auch "content" berechnet, wobei dem Feld "Titel" aufgrund seiner höheren Gewichtung eine höhere Bedeutung zugewiesen wird.

Ausführen einer Textsuche mithilfe eines Textindexes

Nachdem der Textindex erstellt wurde, können Sie Textsuchen mit dem Operator "text" in Ihren Abfragen ausführen. Der Textoperator nimmt eine Suchzeichenfolge und gleicht sie mit dem Textindex ab, um relevante Dokumente zu finden.

  • Führen Sie eine Textsuche für den Ausdruck DocumentDBaus.

    use cosmicworks
    
    db.products.find(
      { $text: { $search: "DocumentDB" } }
    )
    
  • Optional können Sie den $meta Projektionsoperator zusammen mit dem textScore Feld in einer Abfrage verwenden, um die Gewichtung anzuzeigen.

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

Einschränkungen

  • Für eine Auflistung kann nur ein Textindex definiert werden.
  • Sortiervorgänge können die Reihenfolge des Textindexes in MongoDB nicht verwenden.
  • Hinweis() wird nicht in Kombination mit einer Abfrage, die den $text-Ausdruck verwendet, unterstützt.
  • Textindizes können relativ groß sein, was im Vergleich zu anderen Indextypen erheblichen Speicherplatz verbraucht.

WildCard-Indizes

Index für ein einzelnes Feld, indiziert alle Pfade unter dem field , ausgenommen andere Felder, die sich auf derselben Ebene befinden. Beispiel: für das folgende Beispieldokument

{
 "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“.

Einschränkungen

  • Wildcardindizes können keine eindeutigen Indizes unterstützen.
  • Wildcard-Indizes unterstützen Pushdowns von ORDER BY nicht, es sei denn, der Filter enthält nur Pfade, die im Wildcard-Index vorhanden sind, weil 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

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

Azure DocumentDB bietet zwei Arten von geospatialen 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 legacy-Koordinatenpaarstil zum Speichern von Geospatialdaten unterstützt.

Verwenden Sie die createIndex Methode mit der 2d Option zum Erstellen eines geospatialen Indexes für das location Feld.

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

Einschränkungen

  • Nur one Standortfeld kann Teil des 2d Indexes sein, und nur one ein anderes Nicht-Geospatialfeld kann Teil des compound 2d Indexes sein. db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })

2dsphere-Indizes

2dsphere Indizes unterstützen Geospatialabfragen auf einer erdähnlichen Kugel. Sie kann sowohl GeoJSON-Objekte als auch legacykoordinatenpaare unterstützen. 2dSphere Indizes arbeiten mit dem GeoJSON-Stil der Datenspeicherung. Wenn Legacy-Punkte gefunden werden, werden sie in GeoJSON-Punkte konvertiert.

Verwenden Sie die createIndex Methode mit der 2dsphere Option zum Erstellen eines geospatialen Indexes für das location Feld.

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

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

Einschränkungen

  • Ein zusammengesetzter Index, der einen regulären Index und einen geospatialen Index verwendet, wird nicht unterstützt. Das Erstellen eines der geospatialen 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 ein Polygon 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 Feld key ist bei der Verwendung von geoNear Pflicht.

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

Nächste Schritte