Aggiungi Firestore Vector Search alle tue app mobile con Firebase Extensions

1. Panoramica

In questo codelab imparerai ad aggiungere potenti funzionalità di ricerca alla tua app utilizzando la ricerca di somiglianza di vettori di Firestore. Implementerai una funzionalità di ricerca semantica per un'app di appunti scritta in Swift e SwiftUI.

Console Cloud Firestore che mostra alcuni documenti, visibili anche nell'app per iOS sul lato destro.

Cosa imparerai a fare

  • Come installare l'estensione Ricerca vettoriale con Firestore per calcolare gli embedding vettoriali.
  • Come chiamare Firebase Cloud Functions da un'applicazione Swift.
  • Come prefiltrare i dati in base all'utente che ha eseguito l'accesso.

Cosa ti serve

  • Xcode 15.3
  • Il codice campione del codelab. Lo scaricherai in un passaggio successivo del codelab.

2. Crea e configura un progetto Firebase

Per utilizzare l'estensione Firebase Vector Search, devi avere un progetto Firebase. In questa parte del codelab, creerai un nuovo progetto Firebase e attiverai i servizi richiesti, come Cloud Firestore e Firebase Authentication.

Crea un progetto Firebase

  1. Accedi a Firebase
  2. Nella console Firebase, fai clic su Aggiungi progetto, quindi assegna al progetto il nome Firestore Vector Search LabCreare un progetto, passaggio 1 di 3: scegliere il nome del progetto
  3. Fai clic sulle opzioni di creazione del progetto. Accetta i Termini di Firebase, se richiesto.
  4. Nella schermata di Google Analytics, deseleziona la casella Attiva Google Analytics per questo progetto, perché non utilizzerai Analytics per questa app.
  5. Infine, fai clic su Crea progetto.

Per saperne di più sui progetti Firebase, consulta Informazioni sui progetti Firebase.

Eseguire l'upgrade del piano tariffario di Firebase

Per utilizzare Firebase Extensions e i relativi servizi cloud sottostanti, il progetto Firebase deve utilizzare il piano tariffario Blaze con pagamento a consumo, il che significa che deve essere collegato a un account di fatturazione Cloud.

  • Un account di fatturazione Cloud richiede un metodo di pagamento, ad esempio una carta di credito.
  • Se non hai mai utilizzato Firebase e Google Cloud, controlla se hai diritto a un credito di 300$e a un account di fatturazione Cloud di prova senza costi.
  • Se stai svolgendo questo codelab nell'ambito di un evento, chiedi all'organizzatore se sono disponibili crediti Cloud.

Per eseguire l'upgrade del progetto al piano Blaze, segui questi passaggi:

  1. Nella console Firebase, seleziona l'upgrade del piano.
  2. Seleziona il piano Blaze. Segui le istruzioni sullo schermo per collegare un account di fatturazione Cloud al tuo progetto.
    Se hai dovuto creare un account di fatturazione Cloud nell'ambito di questo upgrade, potresti dover tornare al flusso di upgrade nella console Firebase per completarlo.

Attivare e configurare i prodotti Firebase nella console

L'app che stai creando utilizza diversi prodotti Firebase disponibili per le app Apple:

  • Firebase Authentication per consentire agli utenti di accedere facilmente alla tua app.
  • Cloud Firestore per salvare i dati strutturati sul cloud e ricevere notifiche immediate quando i dati subiscono modifiche.
  • Regole di sicurezza Firebase per proteggere il tuo database.

Alcuni di questi prodotti richiedono una configurazione speciale o devono essere attivati utilizzando la console Firebase.

Attivare l'autenticazione anonima per Firebase Authentication

Questa applicazione utilizza l'autenticazione anonima per consentire agli utenti di iniziare a utilizzare l'app senza dover prima creare un account. Ciò si traduce in un processo di onboarding a basso attrito. Per scoprire di più sull'autenticazione anonima (e su come eseguire l'upgrade a un account denominato), consulta le Best practice per l'autenticazione anonima.

  1. Nel riquadro a sinistra della console Firebase, fai clic su Build > Autenticazione. Quindi, fai clic su Inizia.Attivazione di Firebase Authentication
  2. Ora ti trovi nella dashboard Autenticazione, dove puoi visualizzare gli utenti registrati, configurare i provider di accesso e gestire le impostazioni.
  3. Seleziona la scheda Metodo di accesso (o fai clic qui per passare direttamente alla scheda).
  4. Fai clic su Anonimo dalle opzioni del provider, imposta l'opzione su Abilita e poi fai clic su Salva.

Configura Cloud Firestore

Questa applicazione Swift utilizza Cloud Firestore per salvare le note.

Ecco come configurare Cloud Firestore nel tuo progetto Firebase:

  1. Nel riquadro a sinistra della console Firebase, espandi Crea e seleziona Database Firestore.
  2. Fai clic su Crea database.
  3. Lascia l'ID database impostato su (default).
  4. Seleziona una posizione per il database, poi fai clic su Avanti.
    Per un'app reale, devi scegliere una località vicina agli utenti.
  5. Fai clic su Avvia in modalità di test. Leggi il disclaimer sulle regole di sicurezza.
    Più avanti in questo codelab aggiungerai Regole di sicurezza per proteggere i tuoi dati. Non distribuire o esporre pubblicamente un'app senza aggiungere regole di sicurezza per il tuo database.
  6. Fai clic su Crea.

Configurare Cloud Storage for Firebase

L'app web utilizza Cloud Storage per Firebase per archiviare, caricare e condividere le foto.

Ecco come configurare Cloud Storage for Firebase nel tuo progetto Firebase:

  1. Nel riquadro a sinistra della console Firebase, espandi Build e seleziona Archiviazione.
  2. Fai clic su Inizia.
  3. Seleziona una località per il bucket di archiviazione predefinito.
    I bucket in US-WEST1, US-CENTRAL1 e US-EAST1 possono sfruttare il livello "Sempre senza costi" per Google Cloud Storage. I bucket in tutte le altre località seguono i prezzi e l'utilizzo di Google Cloud Storage.
  4. Fai clic su Avvia in modalità di test. Leggi il disclaimer relativo alle regole di sicurezza.
    Più avanti in questo codelab, aggiungerai regole di sicurezza per proteggere i tuoi dati. Non distribuire o esporre un'app pubblicamente senza aggiungere regole di sicurezza per il bucket di archiviazione.
  5. Fai clic su Crea.

3. Collegare l'app mobile

In questa sezione del codelab, scaricherai il codice sorgente di una semplice app per prendere appunti e la collegherai al progetto Firebase che hai appena creato.

Scarica l'app di esempio

  1. Vai alla pagina https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios e clona il repository sulla tua macchina locale.
  2. Apri il progetto Notes.xcodeproj in Xcode

Collega l'app al tuo progetto Firebase

Affinché la tua app possa accedere ai servizi Firebase, devi configurarla nella console Firebase. Puoi collegare più applicazioni client allo stesso progetto Firebase. Ad esempio, se crei un'app per Android o web, devi collegarle allo stesso progetto Firebase.

Per saperne di più sui progetti Firebase, consulta Informazioni sui progetti Firebase.

  1. Nella Console Firebase, vai alla pagina Panoramica del tuo progetto Firebase.La pagina Panoramica della Console Firebase
  2. Fai clic sull'icona iOS+ per aggiungere la tua app per iOS.
  3. Nella schermata Aggiungi Firebase all'app Apple, inserisci l'ID pacchetto dal progetto Xcode (com.google.firebase.codelab.Notes).
  4. Se vuoi, puoi inserire un nickname per l'app (Note per iOS).
  5. Fai clic su Registra app per passare al passaggio successivo.
  6. Scarica il file GoogleServices-Info.plist.
  7. Trascina GoogleServices-Info.plist nella cartella Notes del progetto Xcode. Un buon modo per farlo è inserirlo sotto il file Assets.xcassets.Trascinando il file plist in Xcode
  8. Seleziona Copia elementi se necessario, assicurati che il target Note sia selezionato in Aggiungi a target e fai clic su Fine.Selezionare "Copia se necessario" nella finestra di dialogo per la scelta delle opzioni per l'aggiunta di file
  9. Nella console Firebase ora puoi fare clic sul resto del processo di configurazione: nell'esempio che hai scaricato all'inizio di questa sezione, l'SDK Firebase Apple è già installato e l'inizializzazione è stata configurata. Puoi completare la procedura facendo clic su Vai alla console.

Esegui l'app

È arrivato il momento di provare a usare l'app.

  1. Torna in Xcode ed esegui l'app sul simulatore iOS. Nel menu a discesa Destinazioni di esecuzione, seleziona innanzitutto uno dei simulatori iOS.Selezionare un simulatore iOS nel menu a discesa Destinazioni di esecuzione
  2. Poi fai clic sul pulsante Esegui o premi ⌘ + R.
  3. Una volta che l'app è stata avviata correttamente sul Simulatore, aggiungi un paio di note.
  4. Nella Console Firebase, vai al browser dei dati di Firestore per visualizzare i nuovi documenti creati man mano che aggiungi nuove note nell'app.Console Cloud Firestore che mostra alcuni documenti, insieme al Simulatore iOS che mostra gli stessi documenti

4. Installa l'estensione Vector Search con Firestore

In questa parte del codelab, installerai l'estensione Ricerca vettoriale con Firestore e la configurerai in base ai requisiti dell'app di annotazione su cui stai lavorando.

Avvia l'installazione dell'estensione

  1. Sempre nella sezione Firestore, fai clic sulla scheda Estensioni.Selezionare la scheda Estensioni Firebase nella console Firestore
  2. Fai clic su Esplora l'hub di Extensions.Scheda Firebase Extensions nella console Firestore
  3. Digita "vettore".
  4. Fai clic su "Ricerca vettoriale con estensione Firestore".Pagina di destinazione dell'hub Firebase Extensios Si aprirà la pagina dei dettagli dell'estensione, in cui puoi scoprire di più sull'estensione, sul suo funzionamento, sui servizi Firebase richiesti e su come configurarla.
  5. Fai clic su Installa nella console Firebase.Il pulsante di installazione dell'estensione Ricerca vettoriale con Firestore
  6. Viene visualizzato un elenco di tutti i tuoi progetti.
  7. Scegli il progetto che hai creato nel primo passaggio di questo codelab.Schermata del selettore di progetti Firebase

Configurare l'estensione

  1. Rivedi le API abilitate e le risorse create.Revisione delle API abilitate
  2. Attiva i servizi richiesti.Abilitazione dei servizi richiesti
  3. Una volta abilitati tutti i servizi, fai clic su Avanti.Fai clic su Avanti dopo aver attivato tutti i servizi
  4. Esamina l'accesso concesso a questa estensione.
  5. Configura l'estensione:
    • Seleziona Vertex AI come LLM
    • Percorso della raccolta: notes
    • Limite di query predefinito: 3
    • Nome campo di immissione: text
    • Nome del campo di output: embedding
    • Nome del campo stato:* *status*
    • Incorpora i documenti esistenti:
    • Aggiorna i documenti esistenti:
    • Località della Funzione Cloud: us-central1
  6. Fai clic su Installa estensione per terminare l'installazione.

L'operazione potrebbe richiedere alcuni minuti. Mentre aspetti il completamento dell'installazione, non esitare a passare alla sezione successiva del tutorial e a leggere alcune informazioni di base sugli incorporamenti vettoriali.

5. Contesto

Mentre attendi il completamento dell'installazione, ecco alcune informazioni di base sul funzionamento dell'estensione Ricerca vettoriale con Firestore.

Che cosa sono i vettori, gli embedding e i database vettoriali?

  • I vettori sono oggetti matematici che rappresentano l'intensità e la direzione di una quantità. Possono essere utilizzati per rappresentare i dati in modo da semplificare il confronto e la ricerca.
  • Le rappresentazioni distribuite sono vettori che rappresentano il significato di una parola o una frase. Vengono creati addestrando una rete neurale su un ampio corpus di testo e apprendendo le relazioni tra le parole.
  • I database vettoriali sono database ottimizzati per l'archiviazione e la ricerca di dati vettoriali. Consentono una ricerca efficiente del vicino più prossimo, ovvero il processo di ricerca dei vettori più simili a un determinato vettore di query.

Come funziona la ricerca di vettori?

La ricerca vettoriale funziona confrontando il vettore di query con tutti i vettori del database. I vettori più simili al vettore di query vengono restituiti come risultati della ricerca.

La somiglianza tra due vettori può essere misurata utilizzando una varietà di metriche di distanza. La metrica di distanza più comune è la somiglianza del coseno, che misura l'angolo tra due vettori.

6. Prova l'estensione Vector Search with Firestore

Prima di utilizzare l'estensione Ricerca di vettori con Firestore nell'app per iOS scaricata in precedenza in questo codelab, puoi provarla nella console Firebase.

Leggi la documentazione

Le Estensioni Firebase includono la documentazione relativa al loro funzionamento.

  1. Al termine dell'installazione dell'estensione, fai clic sul pulsante Inizia. La pagina di riepilogo di Firebase Extensions nella console Firebase
  2. Consulta la scheda "Modalità di funzionamento dell'estensione", che spiega:
    • come calcolare gli embedding per i documenti aggiungendoli alla raccolta notes,
    • come eseguire query sull'indice chiamando la funzione richiamabile ext-firestore-vector-search-queryCallable,
    • o come eseguire query sull'indice aggiungendo un documento di query alla raccolta _firestore-vector-search/index/queries.
    • Inoltre, spiega come configurare una funzione di embedding personalizzata, utile se nessuno degli LLM supportati dall'estensione soddisfa i tuoi requisiti e vuoi utilizzare un LLM diverso per calcolare gli embedding. Documentazione dell'estensione Vector Search with Firestore
  3. Fai clic sul link Dashboard di Cloud Firestore per accedere all'istanza Firestore
  4. Vai al documento _firestore-vector-search/index. Dovrebbe mostrare che l'estensione ha terminato il calcolo degli incorporamenti per tutti i documenti di note che hai creato in un passaggio precedente in questo codelab.La configurazione dell'indice all'interno della console Firestore
  5. Per verificare, apri uno dei documenti delle note e dovresti vedere un campo aggiuntivo denominato embedding di tipo vector<768>, nonché un campo status.Un campo di embedding vettoriale nella console Firestore

Crea un documento di esempio

Puoi creare un nuovo documento nella Console Firebase per vedere l'estensione in azione.

  1. Sempre nel browser di dati Firestore, vai alla raccolta notes e fai clic su + Aggiungi documento nella colonna centrale.Aggiunta di un nuovo documento
  2. Fai clic su ID automatico per generare un nuovo ID documento univoco.
  3. Aggiungi un campo denominato text di tipo stringa e incolla del testo nel campo valore. È importante che non si tratti di lorem ipsum o di un altro testo casuale. Scegli un articolo, ad esempio.Aggiunta di un campo di testo
  4. Fai clic su Salva.
    • Nota come l'estensione aggiunge un campo di stato per indicare che sta elaborando i dati.
    • Dopo un breve istante, dovresti vedere un nuovo campo embedding con un valore vector<768>.
    Aggiornamento dello stato degli embedding vettoriali per il nuovo documento

Esegui una query

L'estensione Ricerca vettoriale con Firestore ha una piccola funzionalità utile che ti consente di eseguire query sull'indice dei documenti senza dover collegare un'app.

  1. Nella sezione Firestore della console Firebase, vai al documento _firestore-vector-search/index
  2. Fai clic su + Inizia raccoltaAggiunta di una nuova raccolta secondaria.
  3. Crea una nuova raccolta secondaria denominata queries
  4. Crea un nuovo documento e imposta il campo query su un testo che si trova in uno dei tuoi documenti. Questa opzione è più adatta per le query semantiche, come "Come posso mappare i documenti Firestore con Swift" (a condizione che almeno una delle note che hai aggiunto contenga un testo che illustra questo argomento).Aggiunta di un campo di query
  5. Potresti visualizzare un errore nello statoSi è verificato un errore
  6. Ciò è dovuto a un indice mancante. Per configurare la configurazione dell'indice mancante, vai alla console Google Cloud del tuo progetto seguendo questo link e selezionando il progetto dall'elencoSelezionare il progetto corretto
  7. In Cloud Log Explorer, ora dovresti visualizzare il messaggio di errore "FAILED_PRECONDITION: configurazione dell'indice vettoriale mancante. Crea l'indice richiesto con il seguente comando gcloud: ..."Messaggio di errore nello strumento di esplorazione dei log
  8. Il messaggio di errore contiene anche un comando gcloud che devi eseguire per configurare l'indice mancante.
  9. Esegui il seguente comando dalla riga di comando. Se non hai installato l'interfaccia a riga di comando gcloud sulla tua macchina, segui le istruzioni riportate qui per installarla.
    gcloud alpha firestore indexes composite create --project=INSERT-YOUR=PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding
    
    La creazione dell'indice richiede alcuni minuti. Puoi controllare lo stato di avanzamento nella scheda Indici della sezione Firestore della Console Firebase.Stato del nuovo indice
  10. Una volta configurato l'indice, puoi creare un nuovo documento di query.
  11. Ora dovresti vedere un elenco di ID documento corrispondenti nel campo dei risultatiRisultato dell&#39;esecuzione di una query semantica
  12. Copia uno di questi ID e torna alla raccolta notes.
  13. Utilizza ⌘ + F per cercare l'ID documento che hai copiato: questo documento è quello che corrisponde meglio alla tua query.Trovare l&#39;ID documento nell&#39;elenco dei documenti

7. Implementare la ricerca semantica

È finalmente arrivato il momento di collegare la tua app mobile all'estensione Ricerca vettoriale con Firestore e di implementare una funzionalità di ricerca semantica che consenta agli utenti di cercare nelle loro note utilizzando query in linguaggio naturale.

Collega la funzione richiamabile per eseguire query

L'estensione Ricerca vettoriale con Firestore include una funzione Cloud che puoi chiamare dalla tua app mobile per eseguire query sull'indice creato in precedenza in questo codelab. In questo passaggio, stabilirai una connessione tra la tua app mobile e questa funzione richiamabile. L'SDK Swift di Firebase include API che semplificano le chiamate alle funzioni remote.

  1. Torna a Xcode e assicurati di essere nel progetto che hai clonato in un passaggio precedente di questo codelab.
  2. Apri il file NotesRepository.swift.
  3. Trova la riga contenente private lazy var vectorSearchQueryCallable: Callable = functions.httpsCallable("")

Per richiamare una funzione Cloud invocabile, devi fornire il nome della funzione che vuoi chiamare.

  1. Vai alla console Firebase del tuo progetto e apri l'elemento di menu Funzioni nella sezione Compilazione.
  2. Viene visualizzato un elenco delle funzioni installate dall'estensione.
  3. Cerca quello denominato ext-firestore-vector-search-queryCallable e copia il nome.
  4. Incolla il nome nel codice. Ora dovrebbe essere visualizzato
    private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    

Chiama la funzione di query

  1. Trova il metodo performQuery
  2. Chiama la funzione richiamabile richiamando
    let result = try await vectorSearchQueryCallable(searchTerm)
    

Poiché si tratta di una chiamata remota, potrebbe non riuscire.

  1. Aggiungi alcune funzionalità di base per la gestione degli errori per individuare eventuali errori e registrarli nella console di Xcode.
    private func performQuery(searchTerm: String) async -> [String] {
      do {
        let result = try await vectorSearchQueryCallable(searchTerm)
        return [result]
      }
      catch {
        print(error.localizedDescription)
        return []
      }
    }
    

Collega l'interfaccia utente

Per consentire agli utenti di cercare le note, implementerai una barra di ricerca nella schermata dell'elenco delle note. Quando l'utente digita un termine di ricerca, devi invocare il metodo performQuery implementato nel passaggio precedente. Grazie ai modificatori di visualizzazione searchable e task forniti da SwiftUI, sono necessarie solo un paio di righe di codice.

  1. Innanzitutto, apri NotesListScreen.swift
  2. Per aggiungere una casella di ricerca alla visualizzazione elenco, aggiungi il modificatore di visualizzazione .searchable(text: $searchTerm, prompt: "Search") appena sopra la riga .navigationTitle("Notes")
  3. Quindi, invoca la funzione di ricerca aggiungendo il seguente codice subito sotto:
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}

Questo snippet di codice chiama il metodo semanticSearch in modo asincrono. Fornendo un timeout di 800 millisecondi, indichi al modificatore dell'attività di eliminare il ritardo dell'input dell'utente di 0,8 secondi. Ciò significa che semanticSearch verrà chiamato solo quando l'utente interrompe la digitazione per più di 0,8 secondi.

Il codice dovrebbe avere il seguente aspetto:

...
List(repository.notes) { note in
  NavigationLink(value: note) {
    NoteRowView(note: note)
  }
  .swipeActions {
    Button(role: .destructive, action: { deleteNote(note: note) }) {
      Label("Delete", systemImage: "trash")
    }
  }
}
.searchable(text: $searchTerm, prompt: "Search")
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}
.navigationTitle("Notes")
...

Esegui l'app

  1. Premi ⌘ + R (o fai clic sul pulsante Esegui) per avviare l'app sul simulatore di iOS
  2. Dovresti vedere le stesse note che hai aggiunto nell'app in precedenza in questo codelab, nonché le note aggiunte tramite la console Firebase
  3. Nella parte superiore dell'elenco Note dovresti vedere un campo di ricerca.
  4. Digita un termine che appare in uno dei documenti che hai aggiunto. Anche in questo caso, funziona meglio per le query semantiche, ad esempio "Come faccio a chiamare le API Firebase asincrone da Swift" (a condizione che almeno una delle note aggiunte contenga del testo che tratta questo argomento).
  5. Probabilmente ti aspetti di vedere il risultato di ricerca, ma la visualizzazione elenco è vuota e la console Xcode mostra un messaggio di errore: "La funzione è stata chiamata con un argomento non valido"

L&#39;app Note, con un elenco di risultati vuoto

Ciò significa che hai inviato i dati nel formato sbagliato.

Analizza il messaggio di errore

  1. Per individuare il problema, vai alla console Firebase
  2. Vai alla sezione Funzioni
  3. Individua la funzione ext-firestore-vector-search-queryCallable e apri il menu extra facendo clic sui tre puntini verticali.
  4. Seleziona Visualizza log per accedere a Esplora log
  5. Dovresti visualizzare un errore
Unhandled error ZodError: [
  {
    "code": "invalid_type",
    "expected": "object",
    "received": "string",
    "path": [],
    "message": "Expected object, received string"
  }
]

Ciò significa che i dati sono stati inviati nel formato sbagliato.

Utilizza i tipi di dati corretti

Per scoprire in quale formato l'estensione si aspetta i parametri, consulta la documentazione dell'estensione.

  1. Vai alla sezione Estensioni della Console Firebase
  2. Fai clic su Gestisci ->Gestione dell&#39;estensione Vector Search con Firestore
  3. Nella sezione Modalità di funzionamento dell'estensione troverai una specifica dei parametri di input e output.Documentazione del parametro di input e del valore del risultato
  4. Torna a Xcode e vai a NotesRepository.swift
  5. Aggiungi il seguente codice all'inizio del file:
    private struct QueryRequest: Codable {
      var query: String
      var limit: Int?
      var prefilters: [QueryFilter]?
    }
    
    private struct QueryFilter: Codable {
      var field: String
      var `operator`: String
      var value: String
    
    }
    
    private struct QueryResponse: Codable {
      var ids: [String]
    }
    
    QueryRequest corrisponde alla struttura del parametro di input previsto dall'estensione, in base alla documentazione dell'estensione. Contiene anche un attributo prefilter nidificato che ti servirà in seguito.QueryResponse corrisponde alla struttura della risposta dell'estensione.
  6. Trova la specifica della funzione chiamabile e aggiorna i tipi di input e output
    private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    
  7. Aggiorna l'invocazione della funzione richiamabile in performQuery
    private func performQuery(searchTerm: String) async -> [String] {
      do {
        let queryRequest = QueryRequest(query: searchTerm,
                                        limit: 2)
        let result = try await vectorSearchQueryCallable(queryRequest)
        print(result.ids)
        return result.ids
      }
      catch {
        print(error.localizedDescription)
        return []
      }
    }
    

Esegui di nuovo l'app

  1. Esegui di nuovo l'app
  2. Digita una query di ricerca che contenga i termini inclusi in una delle tue note
  3. Ora dovresti vedere un elenco filtrato di note

Screenshot dell&#39;app con il risultato previsto

Prefiltrare i dati utente

Prima di ballare per festeggiare, si è verificato un problema con la versione attuale dell'app: il set di risultati contiene i dati di tutti gli utenti.

Puoi verificarlo eseguendo l'app su un altro simulatore e aggiungendo altri documenti. I nuovi documenti verranno visualizzati solo in quel simulatore. Se esegui di nuovo l'app sull'altro simulatore, vedrai solo i documenti creati la prima volta.

Se esegui una ricerca, noterai che la chiamata a vectorSearchQueryCallable restituisce ID documento che potrebbero appartenere all'altro utente. Per evitare che ciò accada, dobbiamo utilizzare un prefiltro.

In performQuery, aggiorna il codice come segue:

  let prefilters: [QueryFilter] = if let uid = user?.uid {
    [QueryFilter(field: "userId", operator: "==", value: uid)]
  }
  else {
    []
  }

  let queryRequest = QueryRequest(query: searchTerm,
                                  limit: 2,
                                  prefilters: prefilters)

I dati verranno prefiltrati in base all'ID dell'utente che ha eseguito l'accesso. Come è facile immaginare, questa operazione richiede l'aggiornamento dell'indice Firestore.

Esegui il seguente comando dalla riga di comando per definire un nuovo indice Firestore che includa sia gli embedding userId sia quelli vettoriali nel campo embedding.

gcloud alpha firestore indexes composite create --project=INSERT-YOUR-PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=order=ASCENDING,field-path=userId --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding

Al termine della creazione dell'indice, esegui di nuovo l'app per verificare che funzioni come previsto.

Set di risultati prefiltrati

8. Complimenti

Congratulazioni per aver completato questo codelab.

In questo codelab hai imparato a:

  • Configura un database Cloud Firestore con la ricerca semantica abilitata.
  • Crea una semplice app SwiftUI per interagire con il database.
  • Implementa una barra di ricerca utilizzando il modificatore di visualizzazione ricercabile e il modificatore di attività di SwiftUI.
  • Chiama una funzione Cloud per eseguire una ricerca semantica nel database utilizzando l'interfaccia Callable dell'SDK Firestore.

Con le conoscenze acquisite in questo codelab, ora puoi creare applicazioni potenti che sfruttano le funzionalità di ricerca semantica di Cloud Firestore per offrire agli utenti un'esperienza di ricerca più intuitiva ed efficiente.

Per scoprire di più sul nuovo campo vettoriale di Firestore e su come calcolare gli embedding vettoriali, consulta la documentazione.