Aggiungere la ricerca di vettori di Firestore alle app mobile con Firebase Extensions

1. Panoramica

In questo codelab imparerai ad aggiungere potenti funzionalità di ricerca alla tua app utilizzando la ricerca di somiglianze vettoriali di Firestore. Implementerai una funzionalità di ricerca semantica per un'app per prendere 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.

Che 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 disporre di 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 alla console Firebase utilizzando il tuo Account Google.
  2. Fai clic sul pulsante per creare un nuovo progetto, quindi inserisci un nome per il progetto (ad esempio Firestore Vector Search Codelab).
  3. Fai clic su Continua.
  4. Se richiesto, leggi e accetta i termini di Firebase, quindi fai clic su Continua.
  5. (Facoltativo) Attiva l'assistenza AI nella console Firebase (denominata "Gemini in Firebase").
  6. Per questo codelab non hai bisogno di Google Analytics, quindi disattiva l'opzione Google Analytics.
  7. Fai clic su Crea progetto, attendi il provisioning del progetto, poi fai clic su Continua.

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

Esegui l'upgrade del piano tariffario Firebase

Per utilizzare le estensioni Firebase e i relativi servizi cloud sottostanti, il tuo progetto Firebase deve essere incluso nel piano tariffario con pagamento a consumo (Blaze), il che significa che è 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, verifica se hai diritto a un credito di 300$e a un account Cloud Billing 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:

  1. Nella console Firebase, seleziona l'opzione per eseguire 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.

Abilitare 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 facilmente agli utenti di accedere alla tua app.
  • Cloud Firestore per salvare dati strutturati sul cloud e ricevere una notifica immediata quando i dati cambiano.
  • 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 una procedura di onboarding semplice. Per saperne di più sull'autenticazione anonima (e su come eseguire l'upgrade a un account con nome), consulta la sezione Best practice per l'autenticazione anonima.

  1. Nel riquadro a sinistra della console Firebase, fai clic su Build > Authentication. Poi fai clic su Inizia.Abilitazione 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 andare direttamente alla scheda).
  4. Fai clic su Anonimo tra le opzioni del fornitore, imposta l'opzione su Attiva 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 Build 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 posizione vicina ai tuoi utenti.
  5. Fai clic su Avvia in modalità di test. Leggi l'esclusione di responsabilità relativa alle 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 immagini.

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

  1. Nel riquadro a sinistra della console Firebase, espandi Build e seleziona Storage.
  2. Fai clic su Inizia.
  3. Seleziona una posizione per il bucket di archiviazione predefinito.
    I bucket in US-WEST1, US-CENTRAL1 e US-EAST1 possono usufruire del 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 l'esclusione di responsabilità relativa alle regole di sicurezza.
    Più avanti in questo codelab, aggiungerai regole di sicurezza per proteggere i tuoi dati. Nondistribuire o esporre pubblicamente un'app senza aggiungere regole di sicurezza per il bucket Storage.
  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 lo collegherai al progetto Firebase che hai appena creato.

Scarica l'app di esempio

  1. Vai a 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 connettere più applicazioni client allo stesso progetto Firebase. Ad esempio, se crei un'app web o Android, devi connetterla allo stesso progetto Firebase.

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

  1. Nella console Firebase, vai alla pagina di 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 alla tua app Apple, inserisci l'ID bundle del 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 Note del progetto Xcode. Un buon modo per farlo è trascinarlo sotto il file Assets.xcassets.Trascinare il file plist in Xcode
  8. Seleziona Copia elementi se necessario, assicurati che la destinazione Note sia selezionata in Aggiungi a destinazioni e fai clic su Fine.Selezionando "Copia se necessario" nella finestra di dialogo per la scelta delle opzioni per l'aggiunta di file
  9. Nella console Firebase, ora puoi completare il resto della procedura di configurazione: l'esempio che hai scaricato all'inizio di questa sezione ha già installato l'SDK Firebase Apple e la configurazione di inizializzazione. Puoi completare la procedura facendo clic su Continua alla console.

Esegui l'app

Ora è il momento di provare l'app.

  1. Torna a Xcode ed esegui l'app sul simulatore iOS. Nel menu a discesa Run Destinations (Esegui destinazioni), seleziona prima uno dei simulatori iOS.Selezionando un simulatore iOS nel menu a discesa Destinazioni di esecuzione
  2. Quindi, fai clic sul pulsante Esegui o premi ⌘ + R.
  3. Una volta avviata l'app sul simulatore, aggiungi un paio di note.
  4. Nella console Firebase, vai al browser dei dati Firestore per visualizzare i nuovi documenti creati man mano che aggiungi nuove note nell'app.Console Cloud Firestore che mostra alcuni documenti, insieme a iOS Simulator che mostra gli stessi documenti

4. Installa l'estensione Vector Search con Firestore

In questa parte del codelab, installerai l'estensione Vector Search con Firestore e la configurerai in base ai requisiti dell'app per prendere appunti su cui stai lavorando.

Avvia l'installazione dell'estensione

  1. Sempre nella sezione Firestore, fai clic sulla scheda Estensioni.Selezionando la scheda Firebase Extensions 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 "Vector Search with Firestore extension" (Ricerca vettoriale con l'estensione Firestore).La pagina di destinazione dell'hub Firebase Extensions Si aprirà la pagina dei dettagli dell'estensione, in cui potrai leggere ulteriori informazioni sull'estensione, su come funziona, sui servizi Firebase che richiede 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.La schermata del selettore di progetti Firebase

Configurare l'estensione

  1. Esamina le API abilitate e le risorse create.Esaminando le API abilitate
  2. Attiva i servizi richiesti.Attivazione dei servizi richiesti
  3. Una volta attivati 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: note
    • Limite query predefinito: 3
    • Nome campo di input: text
    • Nome campo di output: embedding
    • Nome campo stato:* *status*
    • Incorpora documenti esistenti:
    • Aggiorna documenti esistenti:
    • Località della Funzione Cloud: us-central1
  6. Fai clic su Installa estensione per completare l'installazione.

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

5. Contesto

Mentre aspetti che l'installazione venga completata, ecco alcune informazioni di base su come funziona l'estensione Vector Search con Firestore.

Che cosa sono vettori, embedding e database vettoriali?

  • I vettori sono oggetti matematici che rappresentano la grandezza e la direzione di una quantità. Possono essere utilizzati per rappresentare i dati in modo da facilitarne il confronto e la ricerca.
  • Gli embedding 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 vettoriale?

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

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

6. Prova l'estensione Ricerca vettoriale con Firestore

Prima di utilizzare l'estensione Vector Search con Firestore nell'app per iOS scaricata in precedenza in questo codelab, puoi provare l'estensione nella console Firebase.

Leggi la documentazione

Le estensioni Firebase includono la documentazione sul loro funzionamento.

  1. Al termine dell'installazione dell'estensione, fai clic sul pulsante Inizia. La pagina di panoramica dell'estensione Firebase nella console Firebase
  2. Consulta la scheda "Come funziona questa estensione", che spiega:
    • come calcolare gli incorporamenti 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.
    • Spiega anche come configurare una funzione di incorporamento personalizzata, utile se nessuno degli LLM supportati dall'estensione soddisfa i tuoi requisiti e vuoi utilizzare un LLM diverso per calcolare gli incorporamenti. La documentazione dell'estensione Vector Search con Firestore
  3. Fai clic sul link Dashboard Cloud Firestore per andare alla tua istanza Firestore
  4. Vai al documento _firestore-vector-search/index. Dovrebbe indicare che l'estensione ha terminato il calcolo degli incorporamenti per tutti i documenti di note che hai creato in un passaggio precedente di questo codelab.La configurazione dell'indice all'interno della console Firestore
  5. Per verificarlo, apri uno dei documenti delle note e dovresti visualizzare un campo aggiuntivo denominato embedding di tipo vector<768>, nonché un campo status.Un campo di incorporamento vettoriale all&#39;interno della 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 dei 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 testo segnaposto o di altro testo casuale. Scegli un articolo di notizie, ad esempio.Aggiungere 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 momento, dovresti vedere un nuovo campo embedding con un valore di vector<768>.
    Aggiornamento dello stato di vector embedding per il nuovo documento

Eseguire una query

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

  1. Nella sezione Firestore della console Firebase, vai al documento _firestore-vector-search/index.
  2. Fai clic su + Avvia raccoltaAggiungere una nuova sottoraccolta
  3. Crea una nuova sottoraccolta denominata queries
  4. Crea un nuovo documento e imposta il campo query su un testo presente in uno dei tuoi documenti. Questa funzionalità è più efficace per le query semantiche, ad esempio "Come posso mappare i documenti Firestore con Swift" (a condizione che almeno una delle note aggiunte contenga testo che tratta questo argomento).Aggiungere 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 per il tuo progetto seguendo questo link e poi selezionando il tuo progetto dall'elencoSelezionare il progetto corretto
  7. In Esplora log di Cloud, ora dovresti visualizzare un messaggio di errore che indica "FAILED_PRECONDITION: Missing vector index configuration. Crea l'indice richiesto con il seguente comando gcloud: ..."Messaggio di errore in Esplora log
  8. Il messaggio di errore contiene anche un comando gcloud che devi eseguire per configurare l'indice mancante.
  9. Esegui questo 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 connettere la tua app mobile all'estensione Vector Search con Firestore e implementare una funzionalità di ricerca semantica che consentirà agli utenti di cercare le note utilizzando query in linguaggio naturale.

Connetti la funzione chiamabile per eseguire query

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

  1. Torna a Xcode e assicurati di trovarti 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 Functions chiamabile, devi fornire il nome della funzione che vuoi chiamare.

  1. Vai alla console Firebase per il tuo progetto e apri la voce di menu Functions nella sezione Build.
  2. Vedrai un elenco delle funzioni installate dall'estensione.
  3. Cerca quello denominato ext-firestore-vector-search-queryCallable e copia il suo 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")
    

Chiamare la funzione di query

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

Poiché si tratta di una chiamata remota, potrebbe non andare a buon fine.

  1. Aggiungi una gestione degli errori di base per rilevare 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 []
      }
    }
    

Connetti l'interfaccia utente

Per consentire agli utenti di cercare nelle note, implementa una barra di ricerca nella schermata dell'elenco delle note. Quando l'utente digita un termine di ricerca, devi richiamare il metodo performQuery che hai implementato nel passaggio precedente. Grazie ai modificatori di visualizzazione searchable e task forniti da SwiftUI, questa operazione richiede 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. Poi, richiama la funzione di ricerca aggiungendo il seguente codice appena sotto:
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}

Questo snippet di codice chiama in modo asincrono il metodo semanticSearch. Fornendo un timeout di 800 millisecondi, indichi al modificatore di attività di eseguire il debounce dell'input dell'utente per 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 ora 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 su iOS Simulator.
  2. Dovresti vedere le stesse note che hai aggiunto nell'app in precedenza in questo codelab, nonché le note che hai aggiunto tramite la console Firebase
  3. Nella parte superiore dell'elenco Note dovrebbe essere presente un campo di ricerca.
  4. Digita un termine che compare in uno dei documenti che hai aggiunto. Anche in questo caso, funziona meglio per le query semantiche, ad esempio "Come posso chiamare le API Firebase asincrone da Swift" (a condizione che almeno una delle note aggiunte contenga testo che tratta questo argomento).
  5. Probabilmente ti aspetti di vedere il risultato di ricerca, ma invece la visualizzazione elenco è vuota e la console Xcode mostra un messaggio di errore: "The function was called with an invalid argument" (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 errato.

Analizzare il messaggio di errore

  1. Per scoprire cosa non va, vai alla console Firebase.
  2. Vai alla sezione Funzioni.
  3. Trova la funzione ext-firestore-vector-search-queryCallable, apri il menu extra facendo clic sui tre puntini verticali
  4. Seleziona Visualizza log per andare 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 hai inviato i dati nel formato errato.

Utilizzare i tipi di dati corretti

Per scoprire in quale formato l'estensione prevede che siano i parametri, consulta la documentazione dell'estensione.

  1. Vai alla sezione Estensioni della console Firebase.
  2. Fai clic su Gestisci ->Gestione dell&#39;estensione Ricerca vettoriale con Firestore
  3. Nella sezione Come funziona questa 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 la chiamata 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 termini inclusi in una delle tue note.
  3. Ora dovresti vedere un elenco filtrato di note

Screenshot dell&#39;app con il risultato previsto

Pre-filtrare i dati utente

Prima di metterti a ballare per festeggiare, c'è un problema con la versione attuale dell'app: il set di risultati contiene 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 nell'altro simulatore, vedrai solo i documenti che hai creato la prima volta.

Se esegui una ricerca, noterai che la chiamata a vectorSearchQueryCallable restituisce ID documento che potrebbero appartenere all'altro utente. Per evitare questo problema, 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)

In questo modo, i dati vengono prefiltrati in base all'ID dell'utente che ha eseguito l'accesso. Come prevedibile, è necessario aggiornare l'indice Firestore.

Esegui questo comando dalla riga di comando per definire un nuovo indice Firestore che includa sia userId sia gli incorporamenti 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

Una volta completata la creazione dell'indice, esegui di nuovo l'app per verificare che funzioni come previsto.

Set di risultati prefiltrato

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 chiamabile dell'SDK Firestore.

Grazie alle 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.