Gestire gli indici della versione Enterprise

Il comportamento di indicizzazione dipende dalla versione del database. Questa pagina descrive come gestire gli indici per Firestore Enterprise Edition. Per la versione Standard di Firestore, consulta Panoramica degli indici della versione Standard di Firestore.

Per scoprire di più sugli indici di Firestore Enterprise, consulta la panoramica degli indici.

Prima di iniziare

Prima di poter creare un indice in Firestore, assicurati di disporre di uno dei seguenti ruoli:

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

Per concedere un ruolo, consulta Concedi un singolo ruolo. Per saperne di più sui ruoli Firestore e sulle autorizzazioni associate, consulta Ruoli predefiniti.

Se hai definito ruoli personalizzati, assegna tutte le seguenti autorizzazioni per creare indici:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

Crea un indice

Per creare un indice, completa i seguenti passaggi:

ConsoleGoogle Cloud
  1. Nella console Google Cloud , vai alla pagina Database.

    Vai a Database

  2. Seleziona un database dall'elenco.
  3. Nel menu di navigazione, fai clic su Indici.
  4. Fai clic su Crea indice.
  5. Inserisci un ID raccolta.
  6. Aggiungi uno o più percorsi dei campi e seleziona un'opzione di indice per ciascuno.
  7. Seleziona un'opzione di presenza del campo, non sparsa o sparsa.
  8. (Facoltativo) Imposta l'opzione Indice univoco.
  9. Fai clic su Crea.
  10. Il nuovo indice viene visualizzato nell'elenco degli indici e Firestore inizia a crearlo. Una volta creato l'indice, vedrai un segno di spunta verde accanto. Se l'indice non viene creato, consulta la sezione Errori di creazione dell'indice per possibili cause.
gcloud CLI

Per creare un indice, utilizza il comando gcloud firestore indexes composite create.

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

Sostituisci quanto segue:

  • DATABASE_ID: un ID database.
  • COLLECTION: un nome di raccolta.
  • FIELD_CONFIGURATION: una configurazione del campo. Per ogni campo, aggiungi --field-config=field-path=. Ad esempio:
        --field-config=field-path=user-id,order=descending \
        --field-config=field-path=score,order=descending
        

    Per saperne di più sulla configurazione di questi campi, consulta --field-config.

Per creare un indice sparso, imposta --density=sparse-any.

Per creare un indice univoco, aggiungi il flag --unique.

Terraform

Utilizza la risorsa google_firestore_index.

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

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

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

Sostituisci quanto segue:

  • DATABASE_ID: L'ID del database scelto
  • COLLECTION: il nome della raccolta da indicizzare
  • FIELD_PATH: il nome del campo da indicizzare
  • ORDER: Uno tra ASCENDING o DESCENDING
  • DENSITY: Uno tra SPARSE_ANY o DENSE

Crea un indice di testo

Per creare un indice di testo, completa i seguenti passaggi:

ConsoleGoogle Cloud
  1. Nella consoleGoogle Cloud , vai alla pagina Database.

    Vai a Database

  2. Seleziona un database dall'elenco.
  3. Nel menu di navigazione, fai clic su Indici.
  4. (Facoltativo) Inserisci un nome per l'indice.
  5. Vai a Tipo di ricerca e seleziona Testo.
  6. Inserisci un ID raccolta.
  7. Configura uno o più campi da indicizzare.
  8. Imposta l'ambito della query per l'indice.
  9. Seleziona una lingua predefinita.
  10. (Facoltativo) Imposta un percorso di override della lingua su un nome di campo che contenga l'impostazione della lingua di un documento.
  11. Fai clic su Crea.
  12. Il nuovo indice viene visualizzato nell'elenco degli indici e Firestore inizia a crearlo. Quando viene creato l'indice, viene visualizzato un segno di spunta verde accanto.
gcloud CLI

Per creare un indice di testo, utilizza il comando gcloud firestore indexes composite create:

gcloud firestore indexes composite create \
  --database='DATABASE_ID' \
  --collection-group=COLLECTION_GROUP \
  --field-config=field-path=FIELD_NAME,search-config='{"text-spec": {"index-specs": [{"index-type": "tokenized", "match-type": "match-globally"}]}}' \
  --search-index-options=text-language=en \
  --async

Sostituisci quanto segue:

  • DATABASE_ID: un ID database.
  • COLLECTION_GROUP: l'ID della raccolta da indicizzare.
  • FIELD_NAME: il nome del campo da indicizzare.

Il flag --async esegue l'operazione di creazione dell'indice in background.

Crea un indice geospaziale

Per creare un indice geospaziale, completa i seguenti passaggi:

ConsoleGoogle Cloud
  1. Nella consoleGoogle Cloud , vai alla pagina Database.

    Vai a Database

  2. Seleziona un database dall'elenco.
  3. Nel menu di navigazione, fai clic su Indici.
  4. (Facoltativo) Inserisci un nome per l'indice.
  5. Vai a Tipo di ricerca e seleziona Geo (2dsphere).
  6. Inserisci un ID raccolta.
  7. Configura uno o più campi da indicizzare.
  8. Imposta l'ambito della query per l'indice.
  9. Fai clic su Crea.

Il nuovo indice viene visualizzato nell'elenco degli indici e Firestore inizia a crearlo. Una volta creato l'indice, viene visualizzato un segno di spunta verde accanto.

gcloud CLI

Per creare un indice spaziale, utilizza il comando gcloud firestore indexes composite create:

gcloud firestore indexes composite create \
  --database='DATABASE_ID' \
  --collection-group=COLLECTION_GROUP \
  --field-config=field-path=FIELD_NAME,search-config='{"geo-spec": {}}' \
  --async

Sostituisci quanto segue:

  • DATABASE_ID: un ID database.
  • COLLECTION_GROUP: l'ID della raccolta da indicizzare.
  • FIELD_NAME: il nome del campo da indicizzare.

Il flag --async esegue l'operazione di creazione dell'indice in background.

Eliminare un indice

Per eliminare un indice, completa i seguenti passaggi:

ConsoleGoogle Cloud
  1. Nella console Google Cloud , vai alla pagina Database.

    Vai a Database

  2. Seleziona un database dall'elenco.
  3. Nel menu di navigazione, fai clic su Indici.
  4. Nell'elenco degli indici, scegli Elimina dal pulsante Altro per l'indice che vuoi eliminare.
  5. Fai clic su Elimina indice.
gcloud CLI
  1. Per trovare il nome dell'indice, utilizza il comando gcloud firestore indexes composite list.

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

    Sostituisci DATABASE_ID con l'ID database.

  2. Per eliminare l'indice, utilizza il comando gcloud firestore indexes composite delete.

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

    Sostituisci quanto segue:

    • INDEX_NAME: il nome di un indice
    • DATABASE_ID: un ID database

Tempo di creazione dell'indice

Per creare un indice, Firestore deve crearlo e poi riempire le voci di indice con i dati esistenti. Il tempo necessario per creare un indice è determinato da quanto segue:

  • Il tempo di creazione minimo per un indice è di alcuni minuti, anche per un database vuoto.

  • Il tempo necessario per eseguire il backfill delle voci di indice dipende dalla quantità di dati esistenti che appartengono al nuovo indice. Più valori di campo corrispondono alla definizione dell'indice, più tempo è necessario per eseguire il backfill delle voci dell'indice.

Gestione delle operazioni a lunga esecuzione

Le build dell'indice sono operazioni a lunga esecuzione. Le sezioni seguenti descrivono come utilizzare le operazioni di lunga durata per gli indici.

Dopo aver iniziato a creare un indice, Firestore assegna all'operazione un nome univoco. I nomi delle operazioni hanno il prefisso projects/PROJECT_ID/databases/DATABASE_ID/operations/, ad esempio:

projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Puoi omettere il prefisso quando specifichi un nome di operazione per il comando describe.

Elenca tutte le operazioni a lunga esecuzione

Per elencare le operazioni a lunga esecuzione, utilizza il comando gcloud firestore operations list. Questo comando elenca le operazioni in corso e quelle completate di recente. Le operazioni vengono elencate per alcuni giorni dopo il completamento:

gcloud firestore operations list

Controlla lo stato dell'operazione

Anziché elencare tutte le operazioni a lunga esecuzione, puoi elencare i dettagli di una singola operazione:

gcloud firestore operations describe operation-name

Stima del tempo di completamento

Mentre l'operazione è in esecuzione, visualizza il valore del campo state per lo stato complessivo dell'operazione.

Una richiesta dello stato di un'operazione a lunga esecuzione restituisce anche le metriche workEstimated e workCompleted. workEstimated mostra il numero totale stimato di documenti che un'operazione elaborerà. workCompleted mostra il numero di documenti elaborati finora. Al termine dell'operazione, workCompleted riflette il numero totale di documenti effettivamente elaborati, che potrebbe essere diverso dal valore di workEstimated.

Per stimare l'avanzamento di un'operazione, dividi workCompleted per workEstimated.

Di seguito è riportato un esempio dell'avanzamento della creazione di un indice:

{
  "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"
        }
       },
    },
    ...

Al termine di un'operazione, la descrizione dell'operazione conterrà "done": true. Visualizza il valore del campo state per il risultato dell'operazione. Se il campo done non è impostato nella risposta, l'operazione non è stata completata.