Indexe verwalten
Firestore gewährleistet die Abfrageleistung durch verbindliche Verwendung von Indexen für jede Abfrage. Die für grundlegende Abfragen erforderlichen Indexe werden automatisch erstellt. Während Sie Ihre Anwendung verwenden und testen, zeigt Cloud Firestore Fehlermeldungen an, mit deren Hilfe Sie zusätzliche Indexe erstellen können, die für Ihre Anwendung erforderlich sind. Auf dieser Seite wird beschrieben, wie Sie Ihre Einzelfeldindexe und zusammengesetzten Indexe verwalten.
Fehlenden Index über eine Fehlermeldung erstellen
Wenn Sie versuchen, eine kumulierende Abfrage mit einer Bereichsklausel auszuführen, die keinem vorhandenen Index zugeordnet ist, erhalten Sie einen Fehler. Die Fehlermeldung enthält einen direkten Link zum Erstellen des fehlenden Index in der Firebase Console.
Folgen Sie dem erstellten Link zur Firebase Console, prüfen Sie die automatisch ausgefüllten Informationen und klicken Sie auf Erstellen.
Rollen und Berechtigungen
Bevor Sie einen Index in Firestore erstellen können, müssen Sie eine der folgenden Rollen haben:
roles/datastore.owner
roles/datastore.indexAdmin
roles/editor
roles/owner
Wenn Sie benutzerdefinierte Rollen definiert haben, weisen Sie alle folgenden Berechtigungen zum Erstellen von Indexen zu:
datastore.indexes.create
datastore.indexes.delete
datastore.indexes.get
datastore.indexes.list
datastore.indexes.update
Google Cloud Platform Console verwenden
Über die Google Cloud Platform Console können Sie Einzelfeldindex-Ausnahmen sowie zusammengesetzte Indexe verwalten.
Zusammengesetzten Index erstellen
So erstellen Sie manuell einen neuen zusammengesetzten Index über die GCP Console:
Rufen Sie in der Google Cloud Console die Seite Datenbanken auf.
Wählen Sie die benötigte Datenbank aus der Liste der Datenbanken aus.
Klicken Sie im Navigationsmenü auf Indexe und dann auf den Tab Komposit.
Klicken Sie auf Index erstellen.
Geben Sie eine Sammlungs-ID ein. Fügen Sie die Namen der Felder, die Sie indexieren möchten, sowie einen Indexmodus für jedes Feld hinzu. Klicken Sie auf Index speichern.
Ihr neuer Index wird in der Liste der zusammengesetzten Indexe angezeigt und Firestore beginnt mit dem Erstellen des Index. Wenn der Index angelegt ist, wird neben dem Index ein grünes Häkchen angezeigt.
Zusammengesetzten Index löschen
So löschen Sie einen zusammengesetzten Index:
Rufen Sie in der Google Cloud Console die Seite Datenbanken auf.
Wählen Sie die benötigte Datenbank aus der Liste der Datenbanken aus.
Klicken Sie im Navigationsmenü auf Indexe und dann auf den Tab Zusammengesetzt.
Klicken Sie in der Liste Ihrer zusammengesetzten Indexe auf die Schaltfläche
Mehr für den Index, den Sie löschen möchten. Klicken Sie auf Löschen.Bestätigen Sie, dass dieser Index gelöscht werden soll. Klicken Sie dafür in der Benachrichtigung auf Index löschen.
Einzelfeldindex-Ausnahme hinzufügen
Mit Einzelfeldindex-Ausnahmen können Sie die Einstellungen für die automatische Indexierung für bestimmte Felder in einer Sammlung überschreiben. Sie können fügen Sie in der Konsole eine Einzelfeldausnahme hinzu:
Rufen Sie in der Google Cloud Console die Seite Datenbanken auf.
Wählen Sie die benötigte Datenbank aus der Liste der Datenbanken aus.
Klicken Sie im Navigationsmenü auf Indexe und dann auf den Tab Einzelfeld.
Klicken Sie auf Ausnahme hinzufügen.
Geben Sie eine Sammlungs-ID und einen Feldpfad ein.
Wählen Sie neue Indexierungseinstellungen für dieses Feld aus. Aktivieren oder deaktivieren Sie für dieses Feld automatisch aktualisierte aufsteigende, absteigende und "array-contains"-Einzelfeldindexe.
Klicken Sie auf Ausnahme speichern.
Ausnahme auf Sammlungsebene hinzufügen
Um eine Einzelfeldindex-Ausnahme zu definieren, die für alle Felder unter einem Sammlungs-ID:
- Klicken Sie auf Ausnahme hinzufügen.
Geben Sie eine Sammlungs-ID für die Sammlungsgruppe ein und legen Sie den Feldpfad auf
*
fest.Wählen Sie die Indexierungsausnahmen aus, die Sie für alle Felder in der Sammlungsgruppe anwenden möchten.
Klicken Sie auf Ausnahme speichern.
Einzelfeldindex-Ausnahme löschen
So löschen Sie eine Einzelfeldindex-Ausnahme:
Rufen Sie in der Google Cloud Console die Seite Datenbanken auf.
Wählen Sie die benötigte Datenbank aus der Liste der Datenbanken aus.
Klicken Sie im Navigationsmenü auf Indexe und dann auf den Tab Einzelnes Feld.
Klicken Sie in der Liste der Einzelfeldindex-Ausnahmen auf die Schaltfläche Mehr
für die Ausnahme, die Sie löschen möchten. Klicken Sie auf Löschen.Bestätigen Sie, dass Sie diese Ausnahme löschen möchten. Klicken Sie dafür in der Benachrichtigung auf Löschen.
Wenn Sie eine Einzelfeldausnahme löschen, werden für das angegebene Feld oder Unterfeld die übernommenen Indexierungseinstellungen verwendet. Dokumentfelder werden auf die Einstellungen Ihrer Datenbank für die automatische Indexierung zurückgesetzt. Für Unterfelder in einer Karte werden alle Ausnahmen der übergeordneten Felder übernommen, bevor die Einstellungen für die automatische Indexierung übernommen werden.
Firebase CLI verwenden
Sie können Indexe auch mit Firebase CLI bereitstellen.
Führen Sie zuerst firebase init firestore
in Ihrem Projektverzeichnis aus.
Während der Einrichtung erstellt Firebase CLI eine JSON-Datei mit den Standardindexen im richtigen Format. Bearbeiten Sie die Datei, um weitere Indexe hinzuzufügen, und stellen Sie sie mit dem Befehl firebase deploy
bereit.
Wenn Sie nur Firestore-Indexe und -Regeln bereitstellen möchten, fügen Sie den Parameter
Flag --only firestore
.
Wenn Sie über die Firebase Console Änderungen an den Indexen vornehmen, Aktualisieren Sie auch Ihre lokale Indexdatei. Weitere Informationen finden Sie in der Referenz zur JSON-Indexdefinition.
Terraform verwenden
Indexe in der Datenbank erstellen
Firestore-Datenbanken können sowohl Einzelfeldindexe als auch zusammengesetzte Indexe enthalten. Sie können die Terraform-Konfigurationsdatei bearbeiten, um einen Index für Ihre Datenbank zu erstellen. Für Einzelfeld- und zusammengesetzte Indexe werden unterschiedliche Terraform-Ressourcentypen verwendet.
Sowohl Indizes im Firestore-nativen Modus als auch im Datastore-Modus werden unterstützt.Einzelfeldindex
Mit der folgenden Terraform-Konfigurationsdatei wird ein Einzelfeldindex für das Feld name
in der Sammlung chatrooms
erstellt:
firestore.tf
resource "random_id" "variable"{ byte_length = 8 } resource "google_firestore_field" "single-index" { project = "project-id" database = "database-id" collection = "chatrooms_${random_id.variable.hex}" field = "name" index_config { indexes { order = "ASCENDING" query_scope = "COLLECTION_GROUP" } indexes { array_config = "CONTAINS" } } ttl_config {} }
- Ersetzen Sie project-id durch Ihre Projekt-ID. Projekt-IDs müssen eindeutig sein.
- Ersetzen Sie database-id durch Ihre Datenbank-ID.
Zusammengesetzter Index
Im folgenden Beispiel für eine Terraform-Konfigurationsdatei wird ein zusammengesetzter Index für eine Kombination aus den Feldern name
und description
in der Sammlung chatrooms
erstellt:
firestore.tf
resource "google_firestore_index" "composite-index" { project = "project-id" database = "database-id" collection = "chatrooms" fields { field_path = "name" order = "ASCENDING" } fields { field_path = "description" order = "DESCENDING" } }
- Ersetzen Sie project-id durch Ihre Projekt-ID. Projekt-IDs müssen eindeutig sein.
- Ersetzen Sie database-id durch Ihre Datenbank-ID.
Indexe im Datastore-Modus
Sie können auch mit Terraform Indexe im Datenspeichermodus erstellen.
datastore.tf
resource "google_firestore_index" "datastore-mode-index" { project = "project-id" database = "database-id" collection = "chatrooms" fields { field_path = "name" order = "ASCENDING" } fields { field_path = "description" order = "DESCENDING" } query_scope = "COLLECTION_GROUP" api_scope = "DATASTORE_MODE_API" }
Von google_datastore_index migrieren
Die Ressource google_datastore_index
wurde verworfen und ist ab terraform-provider-google Version 6.0.0 nicht mehr verfügbar.
Wenn Sie zuvor die google_datastore_index
-Ressource verwendet haben, können Sie zu google_firestore_index
migrieren.
So führen Sie die Migration durch:
- Eine äquivalente
google_firestore_index
-Ressource schreiben - Importieren Sie den vorhandenen Index im Datastore-Modus in die neue Ressource.
- Entfernen Sie Verweise auf die alte
google_datastore_index
-Ressource. - Entfernen Sie die alte
google_datastore_index
-Ressource aus dem Terraform-Status. terraform apply
wird ausgeführt, um Änderungen zu übernehmen.
Detailliertere Anweisungen finden Sie hier:
- Erstellen Sie eine Ersatz-
google_firestore_index
basierend auf Ihrer vorhandenengoogle_datastore_index
-Ressource. Unten finden Sie die erforderlichen Änderungen. - Ermitteln Sie den Firestore-Ressourcenpfad Ihres Index:
export INDEX_RESOURCE_PATH=$(echo '"projects/${google_datastore_index.datastore-index-resource-name.project}/databases/(default)/collectionGroups/${google_datastore_index.datastore-index-resource-name.kind}/indexes/${google_datastore_index.datastore-index-resource-name.index_id}"' | terraform console | tr -d '"')
Ersetzen Sie datastore-index-resource-name durch den Terraform-Namen Ihrer vorhandenen Ressource.
- Importieren Sie den vorhandenen Index im Datastore-Modus in die oben erstellte
google_firestore_index
-Ressource:terraform import google_firestore_index.firestore-index-resource-name $INDEX_RESOURCE_PATH
Ersetzen Sie firestore-index-resource-name durch den Terraform-Namen der vorhandenen Ressource.
Weitere Informationen zum Importieren von Firestore-Indexressourcen finden Sie in der Referenzdokumentation zu google_firestore_index.
- Löschen Sie die vorhandene
google_datastore_index
-Ressource aus der Terraform-Konfigurationsdatei. - Entfernen Sie die vorhandene
google_datastore_index
-Ressource aus dem Terraform-Status:terraform state rm google_datastore_index.datastore-index-resource-name
Weitere Informationen zum Entfernen von Ressourcen Weitere Informationen finden Sie auf der Terraform-Seite unter Ressourcen entfernen.
- Führen Sie
terraform plan
aus. Prüfen Sie die Ausgabe, um sicherzustellen, dass keine Ressourcen erstellt oder gelöscht werden.Prüfen Sie die Ausgabe, um sicherzustellen, dass der Import erfolgreich abgeschlossen wurde. Wenn in der Ausgabe Felder angezeigt werden, die sich ändern, prüfen Sie, ob diese Änderungen beabsichtigt sind. Wenn die Ausgabe eine Zeile enthält, die in etwa so aussieht:
google_firestore_index.firestore-index-resource-name must be replaced
Prüfen Sie dann Ihre Terraform-Konfigurationsdatei, um festzustellen, ob Fehler aufgetreten sind.
- Wenn Sie mit der Ausgabe des Terraform-Plans zufrieden sind, führen Sie Folgendes aus:
terraform apply
- Ersetzen Sie
google_datastore_index
durchgoogle_firestore_index
. - Ersetzen Sie den Argumentnamen
kind
durchcollection
, lassen Sie aber den Argumentwert unverändert. - Ersetzen Sie den Argumentnamen
ancestor
durchquery_scope
. Ersetzen Sie den ArgumentwertALL_ANCESTORS
durchCOLLECTION_RECURSIVE
und jeden anderen Wert durchCOLLECTION_GROUP
. Wenn keinancestor
-Argument vorhanden war, fügen Sie einquery_scope
-Argument mit dem WertCOLLECTION_GROUP
hinzu. - Fügen Sie das Argument
api_scope
mit dem WertDATASTORE_MODE_API
hinzu. - Ersetzen Sie jede Instanz von
properties
durch eine entsprechende Instanz vonfields
. Ersetzen Siename
jedes Vorkommen durchfield_path
und jedes Vorkommen vondirection
durchorder
. Die Einrichtung eines Index dauert einige Minuten. Die Mindesterstellungszeit für einen Index beträgt einige Minuten, auch bei einer leeren Datenbank.
Die Dauer des Backfill hängt davon ab, wie viele vorhandene Daten in den neuen Index gehören. Je mehr Feldwerte mit der Indexdefinition übereinstimmen, desto länger dauert es, bis der Index befüllt ist.
Index übersetzen
Wenn Sie eine google_datastore_index-Ressource in die entsprechende google_firestore_index-Ressource umwandeln möchten, kopieren Sie sie und nehmen Sie die folgenden Änderungen vor:
Betrachten wir beispielsweise diese google_datastore_index
-Ressource:
datastore.tf
resource "google_datastore_index" "legacy" { kind = "foo" properties { name = "property_a" direction = "ASCENDING" } properties { name = "property_b" direction = "ASCENDING" } }
Die entsprechende google_firestore_index
-Ressource wäre:
resource "google_firestore_index" "new" { // note: defaults to the provider project project = project // note: defaults to the (default) database database = "(default)" collection = "foo" api_scope = "DATASTORE_MODE_API" // since there was no "ancestor" property set above, use COLLECTION_GROUP here query_scope = "COLLECTION_GROUP" fields { field_path = "property_a" order = "ASCENDING" } fields { field_path = "property_b" order = "ASCENDING" } }
Indexerstellungszeit
Zum Erstellen eines Indexes muss Firestore den Index einrichten und diesen anschließend mit vorhandenen Daten füllen. Die Indexerstellungszeit ergibt sich aus der Summe der Einrichtungs- und der Backfill-Zeit:
Index-Builds sind Vorgänge mit langer Ausführungszeit.
Nachdem Sie einen Index-Build gestartet haben, weist Firestore dem Vorgang einen eindeutigen Namen zu. Vorgangsnamen haben das Präfix projects/[PROJECT_ID]/databases/(default)/operations/
, zum Beispiel:
projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
Wenn Sie für den Befehl describe
einen Vorgangsnamen angeben, können Sie das Präfix weglassen.
Lang andauernde Vorgänge auflisten
Verwenden Sie zum Auflisten lang andauernder Vorgänge den Befehl gcloud firestore operations list. Dieser Befehl listet laufende und kürzlich abgeschlossene Vorgänge auf. Die Vorgänge sind nach Abschluss einige Tage lang in der Liste enthalten:
gcloud firestore operations list
Vorgangsstatus prüfen
Anstelle aller Vorgänge mit langer Ausführungszeit können Sie auch die Details eines einzelnen Vorgangs auflisten:
gcloud firestore operations describe operation-name
Fertigstellungszeit schätzen
Während der Ausführung eines Vorgangs wird im Feld state
der Gesamtstatus des Vorgangs angezeigt.
Eine Anfrage für den Status eines Vorgangs mit langer Ausführungszeit gibt auch die Messwerte workEstimated
und workCompleted
zurück. Diese Messwerte werden für die Anzahl der Dokumente zurückgegeben. workEstimated
gibt die geschätzte Gesamtzahl der Dokumente an, die ein Vorgang verarbeitet. workCompleted
gibt die Anzahl der bisher verarbeiteten Dokumente an. Nach Abschluss des Vorgangs gibt workCompleted
die Gesamtzahl der tatsächlich verarbeiteten Dokumente wieder, die sich vom Wert von workEstimated
unterscheiden können.
Teilen Sie workCompleted
durch workEstimated
, um eine grobe Schätzung des Fortschritts zu erhalten. Die Schätzung ist möglicherweise ungenau, da sie von der verzögerten Statistikerfassung abhängt.
Dies ist der Fortschrittsstatus eines Index-Builds:
{ "operations": [ { "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI", "metadata": { "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata", "common": { "operationType": "CREATE_INDEX", "startTime": "2020-06-23T16:52:25.697539Z", "state": "PROCESSING" }, "progressDocuments": { "workCompleted": "219327", "workEstimated": "2198182" } }, }, ...
Wenn ein Vorgang abgeschlossen ist, enthält die Vorgangsbeschreibung "done":
true
. Der Wert des Feldes state
stellt das Ergebnis des Vorgangs dar. Wenn das Feld done
nicht in der Antwort festgelegt ist, lautet der Wert false
. Verlassen Sie sich bei laufenden Vorgängen nicht auf die Existenz des Werts done
.
Fehler bei der Indexerstellung
Bei der Nutzung von zusammengesetzten Indexen und Einzelfeldindex-Ausnahmen kann es zu Fehlern der Indexerstellung kommen. Ein Indexierungsvorgang kann fehlschlagen, wenn in Firestore ein Problem mit den Daten auftritt, die indexiert werden sollen. In den meisten Fällen bedeutet dies, dass Sie ein Indexlimit erreicht haben. Beispielsweise hat der Vorgang möglicherweise die maximale Anzahl von Indexeinträgen pro Dokument erreicht.
Wenn die Indexerstellung fehlschlägt, wird die entsprechende Fehlermeldung in der Console angezeigt. Nachdem Sie bestätigt haben, dass Sie keine Indexlimits erreicht haben, führen Sie den Indexierungsvorgang nochmal aus.