Gestione degli indici

Firestore garantisce le prestazioni delle query richiedendo un indice per ogni query. Gli indici obbligatori per le query più basilari vengono creati automaticamente. Quando utilizzi e testi l'app, CloudFirestore genera messaggi di errore che ti consentono di creare ulteriori indici richiesti dall'app. In questa pagina viene descritto come gestire gli indici a campo singolo e compositi.

Crea un indice mancante tramite un messaggio di errore

Se provi una query composta con una clausola di intervallo che non corrisponde a un indice esistente, riceverai un errore. Il messaggio di errore include un link diretto per creare l'indice mancante nella Console Firebase.

Segui il link generato alla console Firebase, esamina le informazioni completate automaticamente e fai clic su Crea.

Utilizzare la console di Google Cloud Platform

Dalla console di Google Cloud Platform, puoi gestire le esenzioni di indicizzazione a campo singolo e gli indici composti.

Crea un indice composto

Per creare manualmente un nuovo indice composto dalla console di GCP:

  1. Vai alla sezione Indici composti.

    Vai alla sezione Indici composti

  2. Fai clic su Crea indice.

  3. Inserisci un ID raccolta. Aggiungi i nomi dei campi da indicizzare e una modalità di indicizzazione per ogni campo. Fai clic su Salva indice.

Il tuo nuovo indice verrà visualizzato nell'elenco degli indici composti eFirestore inizierà a creare l'indice. Una volta completata la creazione dell'indice, vedrai un segno di spunta verde accanto all'indice.

Eliminare un indice composto

Per eliminare un indice composto:

  1. Vai alla sezione Indici composti.

    Vai alla sezione Indici composti

  2. Nell'elenco dei tuoi indici composti, fai clic sul pulsante Altro in corrispondenza dell'indice che vuoi eliminare. Fai clic su Elimina.

  3. Conferma di voler eliminare questo indice facendo clic su Elimina indice dall'avviso.

Aggiungi un'esenzione dell'indice a campo singolo

Le esenzioni dell'indice a campo singolo consentono di ignorare le impostazioni di indicizzazione automatica per campi specifici di una raccolta. Puoi aggiungere esenzioni di singoli campi dalla console:

  1. Vai alla sezione Indici di campo singolo.

    Vai alla sezione Indici di campo singolo

  2. Fai clic su Aggiungi esenzione.

  3. Inserisci un ID raccolta e un Percorso campo.

  4. Seleziona le nuove impostazioni di indicizzazione per questo campo. Abilita o disabilita l'aggiornamento automatico in senso crescente e decrescente e l'array contiene indici a campo singolo per questo campo.

  5. Fai clic su Salva esenzione.

Elimina un'esenzione dell'indice a campo singolo

Per eliminare un'esenzione dell'indice a campo singolo, procedi come segue:

  1. Nel visualizzatore Firestore, vai alla sezione Indici di campo singolo.

    Vai alla sezione Indici di campo singolo

  2. Nell'elenco delle esenzioni dell'indice a campo singolo, fai clic sul pulsante Altro per l'esenzione che vuoi eliminare. Fai clic su Elimina.

  3. Conferma l'eliminazione dell'esenzione facendo clic su Elimina nell'avviso.

Quando elimini un'esenzione di un solo campo, il campo o il sottocampo specificato utilizzerà le impostazioni di indicizzazione ereditate. I campi del documento vengono ripristinati alle impostazioni di indicizzazione automatiche del database. I sottocampi di una mappa ereditano le esenzioni sui campi principali prima di ereditare le impostazioni di indicizzazione automatica.

Utilizza l'interfaccia a riga di comando di Firebase

Puoi anche eseguire il deployment degli indici con l'interfaccia a riga di comando di Firebase. Per iniziare, esegui firebase init firestore nella directory del progetto. Durante la configurazione, l'interfaccia a riga di comando di Firebase genera un file JSON con gli indici predefiniti nel formato corretto. Modifica il file per aggiungere altri indici ed eseguine il deployment con il comando firebase deploy. Se vuoi eseguire il deployment degli indici solo, aggiungi il flag --only firestore:indexes. Se apporti modifiche agli indici utilizzando la Console Firebase, assicurati di aggiornare anche il file degli indici locali. Fai riferimento al riferimento per la definizione dell'indice JSON.

Ora di creazione dell'indice

Per creare un indice, Firestore deve configurarlo e poi eseguirne il backfill con i dati esistenti. Il tempo di compilazione dell'indice è la somma del tempo di configurazione e del tempo di backfill:

  • La configurazione di un indice richiede alcuni minuti. Il tempo minimo di compilazione per un indice è di pochi minuti, anche se il database è vuoto.

  • Il tempo di backfill dipende dalla quantità di dati esistenti nel nuovo indice. Più valori del campo corrispondono alla definizione dell'indice, più tempo occorre per il backfill dell'indice.

Le build dell'indice sono operazioni a lunga esecuzione.

Dopo aver avviato una build dell'indice, Firestore assegna all'operazione un nome univoco. I nomi delle operazioni sono preceduti dal prefisso projects/[PROJECT_ID]/databases/(default)/operations/, ad esempio:

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Tuttavia, puoi escludere il prefisso quando specifichi un nome operazione per il comando describe.

Elenco di 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 completate di recente. Le operazioni saranno elencate per alcuni giorni dopo il completamento:

gcloud firestore operations list

Controlla lo stato dell'operazione

Invece di 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

Durante l'esecuzione dell'operazione, visualizza il valore del campo state per conoscere lo stato generale dell'operazione.

Una richiesta per lo stato di un'operazione a lunga esecuzione restituisce anche le metriche workEstimated e workCompleted. Queste metriche vengono restituite per il numero di documenti. workEstimated mostra il numero totale stimato di documenti elaborati da un'operazione. workCompleted mostra il numero di documenti elaborati finora. Al termine dell'operazione, workCompleted riflette il numero totale di documenti elaborati in realtà, che potrebbero essere diversi dal valore di workEstimated.

Dividi workCompleted per workEstimated per avere una stima approssimativa dell'avanzamento. La stima potrebbe essere imprecisa perché dipende dalla raccolta delle statistiche in ritardo.

Ad esempio, questo è lo stato di avanzamento di una build dell'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"
        }
       },
    },
    ...

Una volta completata, l'operazione conterrà "done": true. Visualizza il valore del campo state per il risultato dell'operazione. Se il campo done non è impostato nella risposta, il suo valore è false. Non dipendono dall'esistenza del valore done per le operazioni in corso.

Errori di creazione dell'indice

Potresti riscontrare errori di creazione dell'indice durante la gestione di indici compositi ed esenzioni dell'indice a campo singolo. Un'operazione di indicizzazione può non riuscire seFirestore riscontra un problema con i dati di indicizzazione. In genere, questo significa che hai raggiunto un limite di indice. Ad esempio, l'operazione potrebbe aver raggiunto il numero massimo di voci dell'indice per documento.

Se la creazione dell'indice non riesce, viene visualizzato il messaggio di errore nella console. Dopo aver verificato di non raggiungere i limiti dell'indice, riprova a eseguire l'operazione dell'indice.