Indexe verwalten

Auf dieser Seite wird beschrieben, wie Sie Ihre Indexe verwalten. Weitere Informationen zu Indexen finden Sie unter Indexe – Übersicht.

Hinweis

Bevor Sie einen Index in Cloud Firestore erstellen können, muss Ihnen eine der folgenden Rollen zugewiesen sein:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

Informationen zum Zuweisen einer Rolle finden Sie unter Einzelne Rolle zuweisen. Weitere Informationen zu Cloud Firestore-Rollen und den zugehörigen Berechtigungen finden Sie unter Vordefinierte Rollen.

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

Index erstellen

So erstellen Sie einen Index:

MongoDB API

Verwenden Sie die Methode createIndex(), um einen Index zu erstellen. Beispiel:

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • Die Indexerstellung mit db.runCommand() wird ebenfalls unterstützt, allerdings mit maximal einem Index.

      db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
      

Beachten Sie die folgenden Beschränkungen:

  • Sie können nur einen Index pro Anfrage erstellen. db.collection.createIndexes() wird nicht unterstützt.
  • Audit-Logs für die Indexerstellung mit der MongoDB API verwenden den Methodennamen google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • Informationen zu unterstützten Indexoptionen finden Sie unter Indexe und Indexattribute.
Firebase Console
  1. Rufen Sie in der Firebase-Konsole die Seite Firestore-Datenbank auf.

    Zur Firestore-Datenbank

  2. Wählen Sie eine Datenbank aus der Liste der Datenbanken aus.
  3. Klicken Sie auf dem Tab Indexe auf Index erstellen.
  4. Geben Sie eine Sammlungs-ID ein.
  5. Fügen Sie einen oder mehrere Feldpfade hinzu und wählen Sie für jeden eine Indexierungsoption aus.
  6. Wählen Sie eine Option für die Feldpräsenz aus, entweder „nicht spärlich“ oder „spärlich“.
  7. Optional können Sie die Option Multikey-Index festlegen.
  8. Klicken Sie auf Erstellen.
  9. Ihr neuer Index wird in der Liste der Indexe angezeigt und Cloud Firestore beginnt mit dem Erstellen des Index. Wenn der Index erstellt wurde, wird neben dem Index ein grünes Häkchen angezeigt. Wenn der Index nicht erstellt wird, finden Sie unter Fehler bei der Indexerstellung mögliche Ursachen.
gcloud CLI

Verwenden Sie zum Erstellen eines Index den Befehl gcloud firestore indexes composite create. Legen Sie api-scope auf mongodb-compatible-api fest.

gcloud firestore indexes composite create \
--database='DATABASE_ID' \
--collection-group=COLLECTION \
--field-config=FIELD_CONFIGURATION \
--query-scope=collection-group \
--density=dense \
--api-scope=mongodb-compatible-api

Ersetzen Sie Folgendes:

  • DATABASE_ID: eine Datenbank-ID.
  • COLLECTION: ein Sammlungsname.
  • FIELD_CONFIGURATION: eine Feldkonfiguration. Fügen Sie für jedes Feld --field-config=field-path= hinzu. Beispiel:
        --field-config=field-path=user-id,order=descending \
        --field-config=field-path=score,order=descending
        

    Weitere Informationen zum Konfigurieren dieser Felder finden Sie unter --field-config.

Um einen spärlichen Index zu erstellen, legen Sie --density=sparse-any fest.

Wenn Sie einen Index mit mehreren Schlüsseln erstellen möchten, fügen Sie das Flag --multikey hinzu.

Wenn Sie einen eindeutigen Index erstellen möchten, fügen Sie das Flag --unique hinzu.

Terraform

Verwenden Sie die Ressource google_firestore_index und legen Sie api_scope auf MONGODB_COMPATIBLE_API und query_scope auf COLLECTION_GROUP fest.

resource "google_firestore_index" "index" {
  database    = "DATABASE_ID"
  collection  = "COLLECTION"
  api_scope   = "MONGODB_COMPATIBLE_API"
  query_scope = "COLLECTION_GROUP"

  // You can include multiple field blocks
  fields {
    field_path = "FIELD_PATH"
    order      = "ORDER"
  }

  // Optional
  multikey = true
  density  = "DENSITY"
}

Ersetzen Sie Folgendes:

  • DATABASE_ID: Die Datenbank-ID für die ausgewählte Datenbank
  • COLLECTION: Der Name der zu indexierenden Sammlung
  • FIELD_PATH: Der Name des zu indexierenden Felds
  • ORDER: Entweder ASCENDING oder DESCENDING
  • DENSITY: Entweder SPARSE_ANY oder DENSE

Textindex erstellen

Erstellen Sie einen Textindex, wenn Sie in einer Sammlung nach bestimmten Strings suchen möchten.

So erstellen Sie einen Textindex für Ihre Sammlung:

MongoDB API

Verwenden Sie die Methode createIndex(), um einen Textindex zu erstellen. Im folgenden Beispiel werden die Felder country oder food indexiert, wenn ein Dokument mit diesen Feldern in die Sammlung cities geschrieben wird.

db.cities.createIndex({"country": "text", "food": "text"})

Ein Feld muss ein String oder ein Array von Strings sein, damit es indexiert werden kann. Array-Indexe werden nicht für die Suche indexiert. Wenn Sie a.1.b indexieren, wird something in {a: {1: {b: something}}}, aber nicht in {a: [one, {b: something}]} indexiert.

Sie können Indexe auch mit db.runCommand() erstellen. Sie können nur einen Textindex pro Sammlung haben, aber mehrere Indexe unterschiedlicher Typen in einem db.runCommand() erstellen. Im folgenden Beispiel wird db.runCommand() verwendet, um einen Textindex zu erstellen:

db.runCommand({
  createIndexes: "cities",
  indexes: [
    {
      key: { "country": "text", "food": "text" },
      name: "country_text_food_text"
    }
  ]
})

Standardsprache festlegen

Sie können optional auch eine Standardsprache oder einen Feldpfad in Ihrem Dokument angeben, der die Standardsprache enthält.

Im folgenden Beispiel wird myLanguageField als language_override angegeben. Wenn ein Dokument in der Sammlung cities ein Feld mit dem Namen myLanguageField enthält, wird der Wert dieses Felds verwendet, um die Sprache für die Indexierung des Felds country für dieses bestimmte Dokument zu bestimmen. Dieser Wert überschreibt die Standardsprache von french.

db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
  • Sie können eine Sprache entweder als Langform (english) oder als zweistelligen ISO-Sprachcode (en) eingeben.
  • Wenn die Standardsprache nicht festgelegt ist, wird standardmäßig Englisch für Cloud Firestore verwendet.
  • Das Feld für die Sprachüberschreibung muss ein Feld der obersten Ebene sein. Wenn das Feld für die Sprachüberschreibung nicht festgelegt ist, wird standardmäßig language verwendet.
  • Wenn Sie die Standardsprache auf das Zeichen null festlegen, wird in Cloud Firestore kein Feld als Sprachüberschreibung verwendet.

Klicken Sie hier, um eine Liste der unterstützten Sprachen aufzurufen.

Sprachcode Sprache
"und" Automatisch erkennen
"af" Afrikaans
„ak“ Akan
„sq“ Albanisch
„am“ Amharisch
„ar“ Arabisch
„hy“ Armenisch
"az" Aserbaidschanisch
"eu" Baskisch
„be“ Belarussisch
„bn“ Bengalisch
„bs“ Bosnisch
„bg“ Bulgarisch
„meine“ Burmesisch
„ca“ Katalanisch
„ceb“ Cebuano
„chr“ Cherokee
„zh“ Chinesisch
„zh-Hant“ Chinesisch (traditionell)
„hr“ Kroatisch
„cs“ Czech
"da" Dänisch
„nl“ Niederländisch
"en" Englisch
"eo" Esperanto
"et" Estnisch
„fil“ Filipino
"fi" Finnisch
"fr" Französisch
„gl“ Galizisch
"ka" Georgisch
„de“ Deutsch
"el" Griechisch
„gu“ Gujarati
„ht“ Haitian_Creole
„ha“ Hausa
„haw“ Hawaii
„iw“ Hebräisch
„hi“ Hindi
„hmn“ Hmong
„hu“ Ungarisch
„ist“ Isländisch
„ig“ Igbo
„id“ Indonesisch
„ga“ Irisch
„it“ Italienisch
„ja“ Japanisch
„jv“ Javanisch
„kn“ Kannada
„kk“ Kasachisch
„km“ Khmer
"ko" Koreanisch
"lo" Laotisch
„la“ Latein
„lv“ Lettisch
„lt“ Litauisch
„lb“ Luxemburgisch
„mk“ Mazedonisch
„mg“ Malagasy
„ms“ Malaiisch
„ml“ Malayalam
"mt" Maltesisch
„mi“ Maori
"mr" Marathi
"mfe" Morisyen
„mn“ Mongolisch
"sr-ME" Serbian_Montenegro
"ne" Nepalesisch
„Nein“ Norwegisch
"ny" Chichewa
„oder“ Oriya
„fa“ Persisch
„pl“ Polnisch
„pt-BR“ Portuguese_Brazil
„pt-PT“ Portuguese_Portugal
„pa“ Punjabi
„ro“ Rumänisch
"ru" Russisch
„gd“ Schottisch-Gälisch
"sr" Serbisch
„st“ Sesotho
"si" Singhalesisch
„sk“ Slowakisch
„sl“ Slowenisch
„so“ Somali
„es“ Spanisch
„su“ Sundanesisch
„sw“ Swahili
„sv“ Swedish
„tg“ Tadschikisch
"ta" Tamil
"te" Telugu
„th“ Thailändisch
"tr" Türkisch
„uk“ Ukrainisch
„ur“ Urdu
"uz" Usbekisch
„vi“ Vietnamesisch
„cy“ Walisisch
„yi“ Jiddisch
„yo“ Yoruba
"zu" Zulu

Textindex partitionieren

Sie können Ihren Index auch mithilfe eines Felds partitionieren, damit Sie Abfragen nach einem bestimmten Feldwert filtern können. Mit dieser Konfiguration können Sie leistungsfähigere Abfragen ausführen, wenn Sie immer ein bestimmtes Feld im Index filtern müssen, den Sie abfragen.

So erstellen Sie einen Index mit einer Partition:firestoreOptions

db.runCommand({
  createIndexes: "cities",
  indexes: [
    {
      key: { "country": "text", "food": "text"},
      name: "country_text_food_text"
      firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
    }
  ]
})

Wobei:

  • PARTITIONED_FIELD ist der Name des Felds, das für die Partition verwendet wird. Dieser Wert muss ein String sein und sich auf ein Feld der obersten Ebene beziehen. Wenn Sie eine Abfrage für einen partitionierten Index ausführen, können Sie die Ergebnisse anhand eines Werts dieses Felds filtern. Sie können Ihren Index beispielsweise mit city partitionieren. Wenn in Ihrem Textindex ein city-Feld definiert ist, können Nutzer Abfragen für eine bestimmte Stadt ausführen.

    Die Partition darf nur ein Feld sein. Wenn Sie einen Index partitionieren, können Sie nur Abfragen ausführen, in denen das partitionierte Feld angegeben ist.

Einschränkungen

  • Sie können nur einen Index pro Anfrage erstellen.
  • Audit-Logs für die Indexerstellung mit der MongoDB API verwenden den Methodennamen google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • Informationen zu unterstützten Indexoptionen finden Sie unter Indexe und Indexeigenschaften.

Firebase Console

  1. Rufen Sie in der Firebase-Konsole die Seite Firestore-Datenbank auf.

    Zur Firestore-Datenbank

  2. Wählen Sie eine Datenbank aus der Liste der Datenbanken aus.

  3. Klicken Sie auf dem Tab Indexe auf Index erstellen.

  4. Geben Sie eine Sammlungs-ID ein.

  5. Fügen Sie einen oder mehrere Feldpfade hinzu und wählen Sie für jeden eine Indexierungsoption aus.

  6. Klicken Sie auf Erstellen.

  7. Ihr neuer Index wird in der Liste der Indexe angezeigt und MongoDB-kompatible Vorgänge beginnen mit dem Erstellen des Index. Wenn der Index erstellt wurde, wird neben dem Index ein grünes Häkchen angezeigt. Wenn kein Index erstellt wird, finden Sie unter Fehler beim Erstellen von Indexen mögliche Ursachen.

2dsphere-Index erstellen

Erstellen Sie einen 2dsphere-Index, um Geodatenabfragen auszuführen und nach Dokumenten zu suchen, die sich in einem bestimmten Bereich von einem bestimmten Längen- und Breitengrad befinden.

So erstellen Sie einen 2dsphere-Index für Ihre Sammlung:

MongoDB API

Verwenden Sie die Methode createIndex(), um einen Index zu erstellen. Beispiel:

db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})

Die Indexerstellung mit db.runCommand() wird auch mit maximal einem Index unterstützt:

db.runCommand({
  createIndexes: "restaurants",
  indexes: [
    {
      key: { "location": "2dsphere", "region": "2dsphere" },
      name: "location_2dsphere_region_2dsphere"
    }
  ]
})

2dsphere-Index partitionieren

Sie können Ihren Index auch mithilfe eines Felds partitionieren, damit Sie Abfragen nach einem bestimmten Feldwert filtern können. Mit dieser Konfiguration können Sie leistungsfähigere Abfragen ausführen, wenn Sie immer ein bestimmtes Feld im Index filtern müssen, den Sie abfragen.

So erstellen Sie einen Index mit einer Partition:firestoreOptions

db.runCommand({
  createIndexes: "restaurants",
  indexes: [
    {
      key: { "location": "2dsphere", "region": "2dsphere" },
      name: "location_2dsphere_region_2dsphere"
      firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
    }
  ]
})

Wobei:

  • PARTITIONED_FIELD ist der Name des Felds, das für die Partition verwendet wird. Wenn Sie eine Abfrage für einen partitionierten Index ausführen, können Sie die Ergebnisse anhand eines Werts dieses Felds filtern. Wenn Ihr Index beispielsweise ein Feld region für regionale Standorte enthält, können Sie ihn mit region partitionieren, damit Nutzer Restaurants in ihrer Region abfragen können.

    Wenn Sie einen Index partitionieren, können Sie nur Abfragen ausführen, in denen das partitionierte Feld angegeben ist.

Einschränkungen

  • Sie können nur einen Index pro Anfrage erstellen.
  • Audit-Logs für die Indexerstellung mit der MongoDB API verwenden den Methodennamen google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • Informationen zu unterstützten Indexoptionen finden Sie unter Indexe und Indexeigenschaften.

Firebase Console

  1. Rufen Sie in der Firebase-Konsole die Seite Firestore-Datenbank auf.

    Zur Firestore-Datenbank

  2. Wählen Sie eine Datenbank aus der Liste der Datenbanken aus.

  3. Klicken Sie auf dem Tab Indexe auf Index erstellen.

  4. Geben Sie eine Sammlungs-ID ein.

  5. Fügen Sie einen oder mehrere Feldpfade hinzu und wählen Sie für jeden eine Indexierungsoption aus.

  6. Klicken Sie auf Erstellen.

  7. Ihr neuer Index wird in der Liste der Indexe angezeigt und MongoDB-kompatible Vorgänge beginnen mit dem Erstellen des Index. Wenn der Index erstellt wurde, wird neben dem Index ein grünes Häkchen angezeigt. Wenn kein Index erstellt wird, finden Sie unter Fehler beim Erstellen von Indexen mögliche Ursachen.

Index löschen

So löschen Sie einen Index:

MongoDB API

Verwenden Sie die Methode dropIndex(), um einen Index zu löschen. Beispiel:

Index anhand des Indexnamens löschen

db.restaurants.dropIndex("cuisine_index")

Index mit Indexdefinition löschen

db.restaurants.dropIndex({"cuisine" : 1})
Firebase Console
  1. Rufen Sie in der Firebase-Konsole die Seite Firestore-Datenbank auf.

    Zur Firestore-Datenbank

  2. Wählen Sie eine Datenbank aus der Liste der Datenbanken aus.
  3. Klicken Sie auf den Tab Indexe.
  4. Wählen Sie in der Liste der Indexe für den Index, den Sie löschen möchten, über den Button Mehr  die Option Löschen aus.
  5. Klicken Sie auf Index löschen.
gcloud CLI
  1. Verwenden Sie den Befehl gcloud firestore indexes composite list, um den Namen des Index zu ermitteln.

    gcloud firestore indexes composite list \
    --database='DATABASE_ID'

    Ersetzen Sie DATABASE_ID durch die Datenbank-ID.

  2. Verwenden Sie den Befehl gcloud firestore indexes composite delete, um den Index zu löschen.

    gcloud firestore indexes composite delete INDEX_NAME \
    --database='DATABASE_ID'

    Ersetzen Sie Folgendes:

    • INDEX_NAME: der Name eines Index
    • DATABASE_ID: eine Datenbank-ID

Indexerstellungszeit

Zum Erstellen eines Index muss Cloud Firestore den Index erstellen und die Indexeinträge dann mit vorhandenen Daten füllen. Die zum Erstellen eines Index erforderliche Zeit hängt von Folgendem ab:

  • Die Mindesterstellungszeit für einen Index beträgt einige Minuten, auch bei einer leeren Datenbank.

  • Die Dauer des Backfill von Indexeinträgen 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 die Indexeinträge befüllt sind.

Vorgänge mit langer Ausführungszeit verwalten

Index-Builds sind Vorgänge mit langer Ausführungszeit. In den folgenden Abschnitten wird beschrieben, wie Sie mit lang laufenden Vorgängen für Indexe arbeiten.

Nachdem Sie mit dem Erstellen eines Index begonnen haben, weist Cloud Firestore dem Vorgang einen eindeutigen Namen zu. Vorgangsnamen haben das Präfix projects/PROJECT_ID/databases/DATABASE_ID/operations/, zum Beispiel:

projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Wenn Sie für den Befehl describe einen Vorgangsnamen angeben, können Sie das Präfix weglassen.

Alle lang andauernden Vorgänge auflisten

Verwenden Sie zum Auflisten von Vorgängen mit langer Ausführungszeit 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. 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.

Um den Fortschritt eines Vorgangs zu schätzen, teilen Sie workCompleted durch workEstimated.

Hier sehen Sie ein Beispiel für den Fortschritt beim Erstellen eines Index:

{
  "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, wurde der Vorgang nicht abgeschlossen.