Firestore Vector Search mit Firebase Extensions in mobile Apps einbinden

1. Übersicht

In diesem Codelab erfahren Sie, wie Sie Ihrer App mithilfe der Firestore-Vektorähnlichkeitssuche leistungsstarke Suchfunktionen hinzufügen. Sie implementieren eine semantische Suchfunktion für eine Notiz-App, die in Swift und SwiftUI geschrieben ist.

Cloud Firestore-Konsole mit einigen Dokumenten, die auch in der iOS-App auf der rechten Seite zu sehen sind

Lerninhalte

  • Informationen zum Installieren der Erweiterung „Vector Search with Firestore“ zum Berechnen von Vektoreinbettungen.
  • Firebase Cloud Functions aus einer Swift-Anwendung aufrufen
  • So können Sie Daten basierend auf dem angemeldeten Nutzer vorfiltern.

Voraussetzungen

  • Xcode 15.3
  • Codelab-Beispielcode. Sie laden ihn in einem späteren Schritt des Codelabs herunter.

2. Firebase-Projekt erstellen und einrichten

Zur Verwendung der Erweiterung für die Firebase-Vektorsuche benötigen Sie ein Firebase-Projekt. In diesem Teil des Codelabs erstellen Sie ein neues Firebase-Projekt und aktivieren die erforderlichen Dienste wie Cloud Firestore und Firebase Authentication.

Firebase-Projekt erstellen

  1. Melden Sie sich in Firebase an.
  2. Klicken Sie in der Firebase Console auf Projekt hinzufügen und nennen Sie Ihr Projekt Firestore Vector Search Lab.Projekt erstellen – Schritt 1 von 3: Projektnamen auswählen
  3. Klicken Sie sich durch die Optionen zur Projekterstellung. Akzeptieren Sie die Firebase-Nutzungsbedingungen, wenn Sie dazu aufgefordert werden.
  4. Entfernen Sie auf dem Google Analytics-Bildschirm das Häkchen aus dem Kästchen Google Analytics für dieses Projekt aktivieren, da Sie Analytics für diese App nicht verwenden werden.
  5. Klicken Sie abschließend auf Projekt erstellen.

Weitere Informationen zu Firebase-Projekten finden Sie unter Firebase-Projekte verstehen.

Firebase-Preismodell upgraden

Wenn Sie Firebase Extensions und die zugrunde liegenden Cloud-Dienste verwenden möchten, muss Ihr Firebase-Projekt den Pay-as-you-go-Tarif (Blaze) haben. Das bedeutet, dass es mit einem Cloud-Rechnungskonto verknüpft sein muss.

  • Für ein Cloud-Rechnungskonto ist eine Zahlungsmethode wie eine Kreditkarte erforderlich.
  • Wenn Sie neu bei Firebase und Google Cloud sind, prüfen Sie, ob Sie Anspruch auf ein Guthaben in Höhe von 300 $ und ein kostenloses Cloud Billing-Konto haben.
  • Wenn Sie dieses Codelab im Rahmen einer Veranstaltung absolvieren, fragen Sie den Organisator, ob Cloud-Guthaben verfügbar ist.

So führen Sie ein Upgrade Ihres Projekts auf den Tarif „Blaze“ aus:

  1. Wählen Sie in der Firebase Console Tarif upgraden aus.
  2. Wählen Sie den Tarif „Blaze“ aus. Folgen Sie der Anleitung auf dem Bildschirm, um ein Cloud-Rechnungskonto mit Ihrem Projekt zu verknüpfen.
    Wenn Sie im Rahmen dieses Upgrades ein Cloud-Rechnungskonto erstellen mussten, müssen Sie möglicherweise zum Upgradevorgang in der Firebase Console zurückkehren, um das Upgrade abzuschließen.

Firebase-Produkte in der Console aktivieren und einrichten

Die App, die Sie erstellen, verwendet mehrere Firebase-Produkte, die für Apple-Apps verfügbar sind:

  • Firebase Authentication ermöglicht es Ihren Nutzern, sich mühelos in der App anzumelden.
  • Cloud Firestore speichert strukturierte Daten in der Cloud und benachrichtigt Sie sofort, wenn sich Daten ändern.
  • Firebase-Sicherheitsregeln zum Schutz Ihrer Datenbank

Einige dieser Produkte erfordern eine spezielle Konfiguration oder müssen über die Firebase Console aktiviert werden.

Anonyme Authentifizierung für Firebase Authentication aktivieren

Diese App nutzt eine anonyme Authentifizierung, damit Nutzer die App verwenden können, ohne ein Konto erstellen zu müssen. Das sorgt für einen reibungslosen Onboarding-Prozess. Weitere Informationen zur anonymen Authentifizierung und zum Upgrade auf ein benanntes Konto finden Sie unter Best Practices für die anonyme Authentifizierung.

  1. Klicken Sie im linken Bereich der Firebase Console auf Build > Authentication (Build > Authentifizierung). Klicken Sie dann auf Jetzt starten.Firebase Authentication aktivieren
  2. Sie befinden sich jetzt im Dashboard „Authentifizierung“. Dort können Sie registrierte Nutzer sehen, Anmeldeanbieter konfigurieren und Einstellungen verwalten.
  3. Wählen Sie den Tab Sign-in method (Anmeldemethode) aus oder klicken Sie hier, um direkt zum Tab zu gelangen.
  4. Klicken Sie in den Anbieteroptionen auf Anonym, stellen Sie den Schalter auf Aktivieren und klicken Sie dann auf Speichern.

Cloud Firestore einrichten

Diese Swift-Anwendung verwendet Cloud Firestore, um Notizen zu speichern.

So richten Sie Cloud Firestore in Ihrem Firebase-Projekt ein:

  1. Maximieren Sie im linken Bereich der Firebase Console Build und wählen Sie dann Firestore-Datenbank aus.
  2. Klicken Sie auf Datenbank erstellen.
  3. Lassen Sie die Datenbank-ID auf (default).
  4. Wählen Sie einen Speicherort für die Datenbank aus und klicken Sie auf Weiter.
    Für eine echte App sollten Sie einen Speicherort in der Nähe Ihrer Nutzer auswählen.
  5. Klicken Sie auf Im Testmodus starten. Lesen Sie den Haftungsausschluss zu den Sicherheitsregeln.
    Später in diesem Codelab fügen Sie Sicherheitsregeln hinzu, um Ihre Daten zu schützen. Apps dürfen nicht veröffentlicht oder veröffentlicht werden, ohne Sicherheitsregeln für Ihre Datenbank hinzuzufügen.
  6. Klicken Sie auf Erstellen.

Cloud Storage for Firebase einrichten

Die Web-App verwendet Cloud Storage for Firebase, um Bilder zu speichern, hochzuladen und zu teilen.

So richten Sie Cloud Storage for Firebase in Ihrem Firebase-Projekt ein:

  1. Maximieren Sie im linken Bereich der Firebase Console die Option Build und wählen Sie dann Storage aus.
  2. Klicken Sie auf Starten.
  3. Wählen Sie einen Speicherort für Ihren Standard-Storage-Bucket aus.
    Für Buckets in US-WEST1, US-CENTRAL1 und US-EAST1 können Sie die Stufe „Immer kostenlos“ für Google Cloud Storage nutzen. Für Buckets an allen anderen Speicherorten gelten die Preise und Nutzungsbedingungen für Google Cloud Storage.
  4. Klicken Sie auf Im Testmodus starten. Lesen Sie den Haftungsausschluss zu den Sicherheitsregeln.
    Später in diesem Codelab fügen Sie Sicherheitsregeln hinzu, um Ihre Daten zu schützen. Veröffentlichen oder verteilen Sie keine App, ohne Sicherheitsregeln für Ihren Speicher-Bucket hinzuzufügen.
  5. Klicken Sie auf Erstellen.

3. Mobile App verknüpfen

In diesem Abschnitt des Codelabs laden Sie den Quellcode für eine einfache Notizen-App herunter und verbinden sie mit dem Firebase-Projekt, das Sie gerade erstellt haben.

Beispielanwendung herunterladen

  1. Rufen Sie https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios auf und klonen Sie das Repository auf Ihren lokalen Computer.
  2. Öffnen Sie das Projekt Notes.xcodeproj in Xcode.

App mit Ihrem Firebase-Projekt verbinden

Damit Ihre App auf Firebase-Dienste zugreifen kann, müssen Sie sie in der Firebase Console einrichten. Sie können mehrere Clientanwendungen mit demselben Firebase-Projekt verbinden. Wenn Sie beispielsweise eine Android- oder Web-App erstellen, sollten Sie sie mit demselben Firebase-Projekt verbinden.

Weitere Informationen zu Firebase-Projekten finden Sie unter Firebase-Projekte verstehen.

  1. Rufen Sie in der Firebase Console die Übersichtsseite Ihres Firebase-Projekts auf.Die Übersichtsseite der Firebase Console
  2. Klicken Sie auf das iOS-Symbol +, um Ihre iOS-App hinzuzufügen.
  3. Fügen Sie auf dem Bildschirm Firebase zu Ihrer Apple-App hinzufügen die Bundle-ID aus dem Xcode-Projekt ein (com.google.firebase.codelab.Notes).
  4. Sie können auch einen Alias für die App eingeben (Notizen für iOS).
  5. Klicken Sie auf „App registrieren“, um mit dem nächsten Schritt fortzufahren.
  6. Laden Sie die Datei GoogleServices-Info.plist herunter.
  7. Ziehen Sie GoogleServices-Info.plist in den Ordner Notes Ihres Xcode-Projekts. Sie können sie beispielsweise unter der Datei Assets.xcassets ablegen.Plist-Datei in Xcode ziehen
  8. Wählen Sie Elemente bei Bedarf kopieren aus, achten Sie darauf, dass unter Zielen hinzufügen das Ziel Notizen ausgewählt ist, und klicken Sie auf Fertigstellen.Im Dialogfeld „Optionen zum Hinzufügen von Dateien auswählen“ die Option „Bei Bedarf kopieren“ auswählen
  9. In der Firebase Console können Sie jetzt den Rest des Einrichtungsvorgangs durchklicken. In der Beispieldatei, die Sie zu Beginn dieses Abschnitts heruntergeladen haben, ist das Firebase Apple SDK bereits installiert und die Initialisierung eingerichtet. Klicken Sie auf Weiter zur Konsole, um den Vorgang abzuschließen.

Anwendung ausführen

Jetzt ist es an der Zeit, die App auszuprobieren!

  1. Führen Sie die App in Xcode im iOS-Simulator aus. Wählen Sie im Drop-down-Menü Ausführungsziele zuerst einen der iOS-Simulatoren aus.iOS-Simulator im Drop-down-Menü „Ausführungsziele“ auswählen
  2. Klicken Sie dann auf die Schaltfläche Ausführen oder drücken Sie ⌘ + R.
  3. Nachdem die App im Simulator gestartet wurde, fügen Sie einige Notizen hinzu.
  4. Rufen Sie in der Firebase Console den Firestore-Datenbrowser auf, um zu sehen, welche neuen Dokumente erstellt werden, wenn Sie in der App neue Notizen hinzufügen.Cloud Firestore Console mit einigen Dokumenten neben dem iOS-Simulator, in dem dieselben Dokumente angezeigt werden

4. Erweiterung „Vektorsuche mit Firestore“ installieren

In diesem Teil des Codelabs installieren Sie die Erweiterung „Vector Search with Firestore“ und konfigurieren sie für die Notiz-App, an der Sie gerade arbeiten.

Installation der Erweiterung starten

  1. Klicken Sie im Bereich „Firestore“ auf den Tab Erweiterungen.In der Firestore Console den Tab „Firebase-Erweiterungen“ auswählen
  2. Klicken Sie auf Im Extensions Hub umsehen.Tab „Firebase Extensions“ in der Firestore Console
  3. Geben Sie „vector“ ein.
  4. Klicken Sie auf „Vektorsuche mit Firestore-Erweiterung“.Landingpage des Firebase Extensions Hubs Daraufhin wird die Seite mit den Details zur Erweiterung geöffnet. Dort finden Sie weitere Informationen zur Erweiterung, zu ihrer Funktionsweise, zu den erforderlichen Firebase-Diensten und zur Konfiguration.
  5. Klicken Sie auf In der Firebase Console installieren.Die Schaltfläche „Installieren“ für die Erweiterung „Vektorsuche mit Firestore“
  6. Daraufhin wird eine Liste aller Ihrer Projekte angezeigt.
  7. Wählen Sie das Projekt aus, das Sie im ersten Schritt dieses Codelabs erstellt haben.Der Bildschirm mit der Firebase-Projektauswahl

Erweiterung konfigurieren

  1. Prüfen Sie die aktivierten APIs und erstellten Ressourcen.Aktivierte APIs überprüfen
  2. Aktivieren Sie die erforderlichen Dienste.Erforderliche Dienste aktivieren
  3. Klicken Sie auf Weiter, sobald alle Dienste aktiviert sind.Klicken Sie nach dem Aktivieren aller Dienste auf „Weiter“
  4. Prüfen Sie den Zugriff, der dieser Erweiterung gewährt wurde.
  5. Konfigurieren Sie die Erweiterung:
    • Wählen Sie Vertex AI als LLM aus.
    • Aufrufpfad der Sammlung: notes
    • Standardlimit für Suchanfragen: 3
    • Name des Eingabefelds: text
    • Name des Ausgabefelds: embedding
    • Name des Statusfelds:* *status*
    • Vorhandene Dokumente einbetten: Ja
    • Vorhandene Dokumente aktualisieren: Ja
    • Speicherort der Cloud-Funktion: us-central1
  6. Klicken Sie auf Erweiterung installieren, um die Installation abzuschließen.

Das kann einige Minuten dauern. Während Sie auf den Abschluss der Installation warten, können Sie mit dem nächsten Abschnitt der Anleitung fortfahren und sich Hintergrundinformationen zu Vektoreinbettungen durchlesen.

5. Hintergrund

Während die Installation läuft, finden Sie hier einige Hintergrundinformationen zur Funktionsweise der Erweiterung „Vektorsuche mit Firestore“.

Was sind Vektoren, Einbettungen und Vektordatenbanken?

  • Vektoren sind mathematische Objekte, die die Größe und Richtung einer Größe darstellen. Sie können verwendet werden, um Daten so darzustellen, dass sie leichter zu vergleichen und zu suchen sind.
  • Einbettungen sind Vektoren, die die Bedeutung eines Wortes oder einer Wortgruppe darstellen. Sie werden erstellt, indem ein neuronales Netzwerk mit einem großen Textkorpus trainiert und die Beziehungen zwischen Wörtern gelernt werden.
  • Vektordatenbanken sind Datenbanken, die für das Speichern und Suchen von Vektordaten optimiert sind. Sie ermöglichen eine effiziente Suche nach dem nächsten Nachbarn. Dabei werden die Vektoren ermittelt, die einem bestimmten Abfragevektor am ähnlichsten sind.

Wie funktioniert die Vektorsuche?

Bei der Vektorsuche wird der Abfragevektor mit allen Vektoren in der Datenbank verglichen. Die Vektoren, die dem Abfragevektor am ähnlichsten sind, werden als Suchergebnisse zurückgegeben.

Die Ähnlichkeit zwischen zwei Vektoren kann mit einer Vielzahl von Entfernungsmesswerten gemessen werden. Der gängigste Entfernungsmesswert ist die Kosinus-Ähnlichkeit, mit der der Winkel zwischen zwei Vektoren gemessen wird.

6. Vektorsuche mit Firestore-Erweiterung ausprobieren

Bevor Sie die Erweiterung Vektorsuche mit Firestore in der iOS-App verwenden, die Sie zuvor in diesem Codelab heruntergeladen haben, können Sie die Erweiterung in der Firebase Console ausprobieren.

Dokumentation lesen

Firebase Extensions enthalten eine Dokumentation zur Funktionsweise.

  1. Klicken Sie nach Abschluss der Installation auf die Schaltfläche Jetzt starten. Die Übersichtsseite für Firebase Extensions in der Firebase Console
  2. Auf dem Tab „Funktionsweise dieser Erweiterung“ finden Sie folgende Informationen:
    • wie Sie Einbettungen für Dokumente berechnen, indem Sie sie der Sammlung notes hinzufügen,
    • wie Sie den Index durch Aufrufen der aufrufbaren Funktion ext-firestore-vector-search-queryCallable abfragen.
    • oder wie Sie den Index abfragen, indem Sie der Sammlung „_firestore-vector-search/index/queries“ ein Abfragedokument hinzufügen.
    • Außerdem wird erläutert, wie Sie eine benutzerdefinierte Einbettungsfunktion einrichten. Das ist nützlich, wenn keines der von der Erweiterung unterstützten LLMs Ihre Anforderungen erfüllt und Sie ein anderes LLM zum Berechnen von Einbettungen verwenden möchten. Dokumentation für die Erweiterung „Vektorsuche mit Firestore“
  3. Klicken Sie auf den Link Cloud Firestore-Dashboard, um zu Ihrer Firestore-Instanz zu gelangen.
  4. Rufen Sie das Dokument _firestore-vector-search/index auf. Hier sollte angezeigt werden, dass die Erweiterung die Einbettungen für alle Notizendokumente abgeschlossen hat, die du in einem früheren Schritt in diesem Codelab erstellt hast.Indexkonfiguration in der Firestore Console
  5. Öffnen Sie dazu eines der Notizendokumente. Sie sollten ein zusätzliches Feld namens embedding vom Typ vector<768> sowie ein status-Feld sehen.Ein Vektoreinbettungs-Feld in der Firestore Console

Beispieldokument erstellen

Sie können in der Firebase Console ein neues Dokument erstellen, um die Erweiterung in Aktion zu sehen.

  1. Rufen Sie im Firestore-Datenbrowser die Sammlung notes auf und klicken Sie in der mittleren Spalte auf + Dokument hinzufügen.Neues Dokument hinzufügen
  2. Klicken Sie auf Automatisch generierte ID, um eine neue eindeutige Dokument-ID zu generieren.
  3. Fügen Sie ein Feld mit dem Namen text vom Typ „String“ hinzu und fügen Sie Text in das Feld Wert ein. Es ist wichtig, dass es sich dabei nicht um Lorem Ipsum oder einen anderen zufälligen Text handelt. Wählen Sie beispielsweise einen Nachrichtenartikel aus.Textfeld hinzufügen
  4. Klicken Sie auf Speichern.
    • Beachten Sie, dass die Erweiterung ein Statusfeld hinzufügt, um anzugeben, dass Daten verarbeitet werden.
    • Nach kurzer Zeit sollte ein neues Feld embedding mit dem Wert vector<768> angezeigt werden.
    Aktualisierung des Status der Vektoreinbettungen für das neue Dokument

Abfrage ausführen

Die Vektorsuche mit Firestore-Erweiterung hat eine raffinierte kleine Funktion, mit der Sie den Dokumentindex abfragen können, ohne eine Verbindung zu einer App herstellen zu müssen.

  1. Rufen Sie im Firestore-Abschnitt der Firebase Console das Dokument _firestore-vector-search/index auf.
  2. Klicken Sie auf + Sammlung starten.Neue untergeordnete Sammlung hinzufügen
  3. Erstellen Sie eine neue Untersammlung mit dem Namen queries.
  4. Erstellen Sie ein neues Dokument und geben Sie im Feld query einen Text ein, der in einem Ihrer Dokumente vorkommt. Das funktioniert am besten bei semantischen Suchanfragen wie „Wie kann ich Firestore-Dokumente mit Swift abgleichen?“, vorausgesetzt, mindestens eine der hinzugefügten Notizen enthält Text zu diesem Thema.Suchfeld hinzufügen
  5. Möglicherweise wird im Status ein Fehler angezeigt.Ein Fehler ist aufgetreten
  6. Das liegt an einem fehlenden Index. Rufen Sie die Google Cloud Console für Ihr Projekt auf (diesen Link anklicken) und wählen Sie Ihr Projekt aus der Liste aus, um die fehlende Indexkonfiguration einzurichten.Das richtige Projekt auswählen
  7. Im Cloud Log Explorer sollten Sie jetzt die Fehlermeldung „FAILED_PRECONDITION: Missing vector Index configuration“ sehen. Erstellen Sie den erforderlichen Index mit dem folgenden gcloud-Befehl: ..."Fehlermeldung im Log-Explorer
  8. Die Fehlermeldung enthält auch einen gcloud-Befehl, den Sie ausführen müssen, um den fehlenden Index zu konfigurieren.
  9. Führen Sie in der Befehlszeile den folgenden Befehl aus. Wenn die gcloud CLI nicht auf Ihrem Computer installiert ist, folgen Sie dieser Anleitung, um sie zu installieren.
    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
    
    Das Erstellen des Index dauert einige Minuten. Sie können den Fortschritt im Abschnitt „Firestore“ der Firebase Console auf dem Tab Indexe prüfen.Status des neuen Index
  10. Sobald der Index eingerichtet ist, können Sie ein neues Abfragedokument erstellen.
  11. Im Ergebnisfeld sollte jetzt eine Liste der übereinstimmenden Dokument-IDs angezeigt werden.Ergebnis einer semantischen Abfrage
  12. Kopieren Sie eine dieser IDs und kehren Sie zur Sammlung notes zurück.
  13. Mit ⌘+F können Sie nach der Dokument-ID suchen, die Sie kopiert haben. Dieses Dokument entspricht am besten Ihrer Suchanfrage.Dokument-ID in der Liste der Dokumente finden

7. Semantische Suche implementieren

Jetzt ist es an der Zeit, Ihre mobile App mit der Vector Search-Erweiterung für Firestore zu verbinden und eine semantische Suchfunktion zu implementieren, mit der Nutzer ihre Notizen mithilfe von Suchanfragen in natürlicher Sprache durchsuchen können.

Aufrufbare Funktion für die Ausführung von Abfragen verbinden

Die Erweiterung „Vector Search with Firestore“ enthält eine Cloud-Funktion, die Sie von Ihrer mobilen App aus aufrufen können, um den Index abzufragen, den Sie zuvor in diesem Codelab erstellt haben. In diesem Schritt stellen Sie eine Verbindung zwischen Ihrer mobilen App und dieser aufrufbaren Funktion her. Das Swift SDK von Firebase enthält APIs, die den Aufruf von Remotefunktionen nahtlos ermöglichen.

  1. Kehren Sie zu Xcode zurück und prüfen Sie, ob Sie sich im Projekt befinden, das Sie in einem vorherigen Schritt in diesem Codelab geklont haben.
  2. Öffnen Sie die Datei NotesRepository.swift.
  3. Suchen Sie die Zeile, die private lazy var vectorSearchQueryCallable: Callable = functions.httpsCallable("") enthält.

Wenn Sie eine aufrufbare Cloud-Funktion aufrufen möchten, müssen Sie den Namen der Funktion angeben, die Sie aufrufen möchten.

  1. Rufen Sie die Firebase Console für Ihr Projekt auf und öffnen Sie im Bereich Build den Menüpunkt Functions.
  2. Es wird eine Liste der Funktionen angezeigt, die von der Erweiterung installiert wurden.
  3. Suchen Sie nach ext-firestore-vector-search-queryCallable und kopieren Sie den Namen.
  4. Fügen Sie den Namen in den Code ein. Es sollte jetzt so aussehen:
    private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    

Abfragefunktion aufrufen

  1. Methode performQuery finden
  2. Rufen Sie die aufrufbare Funktion mit
    let result = try await vectorSearchQueryCallable(searchTerm)
    

Da es sich um einen Remote-Aufruf handelt, kann er fehlschlagen.

  1. Fügen Sie eine einfache Fehlerbehandlung hinzu, um Fehler abzufangen und in der Xcode-Konsole zu protokollieren.
    private func performQuery(searchTerm: String) async -> [String] {
      do {
        let result = try await vectorSearchQueryCallable(searchTerm)
        return [result]
      }
      catch {
        print(error.localizedDescription)
        return []
      }
    }
    

Benutzeroberfläche verbinden

Damit Nutzende in ihren Notizen suchen können, implementieren Sie eine Suchleiste im Bildschirm mit der Notizenliste. Wenn der Nutzer einen Suchbegriff eingibt, müssen Sie die performQuery-Methode aufrufen, die Sie im vorherigen Schritt implementiert haben. Dank der SwiftUI-Ansichtsmodifikatoren searchable und task sind dafür nur wenige Codezeilen erforderlich.

  1. Öffnen Sie zuerst NotesListScreen.swift.
  2. Wenn Sie der Listenansicht ein Suchfeld hinzufügen möchten, fügen Sie den Ansichtsmodifikatoren .searchable(text: $searchTerm, prompt: "Search") direkt über der Zeile .navigationTitle("Notes") hinzu.
  3. Rufen Sie dann die Suchfunktion auf, indem Sie den folgenden Code hinzufügen:
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}

In diesem Code-Snippet wird die semanticSearch-Methode asynchron aufgerufen. Wenn Sie eine Zeitüberschreitung von 800 Millisekunden angeben, weisen Sie den Aufgaben-Modifier an, die Eingabe des Nutzers um 0,8 Sekunden zu verzögern. Das bedeutet, dass semanticSearch nur aufgerufen wird, wenn der Nutzer länger als 0,8 Sekunden nicht tippt.

Ihr Code sollte jetzt so aussehen:

...
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")
...

Anwendung ausführen

  1. Drücken Sie ⌘ + R (oder klicken Sie auf die Schaltfläche „Ausführen“), um die App im iOS-Simulator zu starten.
  2. Sie sollten dieselben Notizen sehen, die Sie zuvor in diesem Codelab in der App hinzugefügt haben, sowie alle Notizen, die Sie über die Firebase Console hinzugefügt haben.
  3. Oben in der Liste Notizen sollte ein Suchfeld angezeigt werden.
  4. Geben Sie einen Begriff ein, der in einem der hinzugefügten Dokumente vorkommt. Auch hier funktioniert das am besten bei semantischen Suchanfragen wie „Wie kann ich asynchrone Firebase APIs von Swift aus aufrufen?“, vorausgesetzt, mindestens eine der hinzugefügten Notizen enthält Text zu diesem Thema.
  5. Sie erwarten wahrscheinlich, dass das Suchergebnis angezeigt wird. Stattdessen ist die Listenansicht leer und in der Xcode-Konsole wird die Fehlermeldung „Die Funktion wurde mit einem ungültigen Argument aufgerufen“ angezeigt.

Die Notizen-App mit einer leeren Ergebnisliste

Das bedeutet, dass Sie die Daten im falschen Format gesendet haben.

Fehlermeldung analysieren

  1. Rufen Sie die Firebase Console auf, um herauszufinden, was das Problem ist.
  2. Gehen Sie zum Abschnitt Funktionen.
  3. Suchen Sie die Funktion ext-firestore-vector-search-queryCallable und öffnen Sie das Dreipunkt-Menü.
  4. Wählen Sie Protokolle ansehen aus, um den Log-Explorer aufzurufen.
  5. Es sollte ein Fehler angezeigt werden.
Unhandled error ZodError: [
  {
    "code": "invalid_type",
    "expected": "object",
    "received": "string",
    "path": [],
    "message": "Expected object, received string"
  }
]

Das bedeutet, dass Sie die Daten im falschen Format gesendet haben.

Die richtigen Datentypen verwenden

Informationen dazu, in welchem Format die Erweiterung die Parameter erwartet, finden Sie in der Dokumentation der Erweiterung.

  1. Rufen Sie in der Firebase Console den Bereich Erweiterungen auf.
  2. Klicken Sie auf Verwalten ->Vektorsuche mit der Firestore-Erweiterung verwalten.
  3. Im Abschnitt Funktionsweise dieser Erweiterung finden Sie eine Beschreibung der Eingabe- und Ausgabeparameter.Dokumentation des Eingabeparameters und des Ergebniswerts
  4. Kehren Sie zu Xcode zurück und gehen Sie zu NotesRepository.swift.
  5. Fügen Sie am Anfang der Datei den folgenden Code ein:
    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 stimmt mit der Struktur des Eingabeparameters überein, der von der Erweiterung gemäß der Dokumentation der Erweiterung erwartet wird. Außerdem enthält es ein verschachteltes prefilter-Attribut, das Sie später benötigen.QueryResponse entspricht der Struktur der Antwort der Erweiterung.
  6. Spezifikation der aufrufbaren Funktion suchen und Eingabe- und Ausgabetypen aktualisieren
    private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    
  7. Aufruf der aufrufbaren Funktion in performQuery aktualisieren
    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 []
      }
    }
    

App noch einmal ausführen

  1. App noch einmal ausführen
  2. Geben Sie eine Suchanfrage ein, die Begriffe enthält, die in einer Ihrer Notizen enthalten sind.
  3. Sie sollten jetzt eine gefilterte Liste der Notizen sehen.

Screenshot der App mit dem erwarteten Ergebnis

Nutzerdaten vorfiltern

Bevor Sie in Jubel ausbrechen: Es gibt ein Problem mit der aktuellen Version der App: Die Ergebnismenge enthält Daten aller Nutzer.

Sie können das überprüfen, indem Sie die App auf einem anderen Simulator ausführen und weitere Dokumente hinzufügen. Die neuen Dokumente werden nur in diesem Simulator angezeigt. Wenn Sie die App noch einmal auf dem anderen Simulator ausführen, sehen Sie nur Dokumente, die Sie beim ersten Mal erstellt haben.

Wenn Sie eine Suche durchführen, stellen Sie fest, dass der Aufruf von vectorSearchQueryCallable Dokument-IDs zurückgibt, die möglicherweise dem anderen Nutzer gehören. Um dies zu verhindern, müssen wir einen Vorfilter verwenden.

Aktualisieren Sie den Code in performQuery so:

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

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

Dadurch werden die Daten basierend auf der ID des angemeldeten Nutzers vorgefiltert. Dazu muss der Firestore-Index aktualisiert werden.

Führen Sie den folgenden Befehl in der Befehlszeile aus, um einen neuen Firestore-Index zu definieren, der sowohl die userId als auch die Vektor-Embeddings im Feld embedding enthält.

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

Führen Sie die App nach Abschluss des Indexaufbaus noch einmal aus, um zu prüfen, ob sie wie erwartet funktioniert.

Vorgefilterter Ergebnissatz

8. Glückwunsch

Herzlichen Glückwunsch zum erfolgreichen Abschluss dieses Codelabs.

In diesem Codelab haben Sie Folgendes gelernt:

  • Richten Sie eine Cloud Firestore-Datenbank mit aktivierter semantischer Suche ein.
  • Erstellen Sie eine einfache SwiftUI-App, um mit der Datenbank zu interagieren.
  • Implementieren Sie eine Suchleiste mit dem SwiftUI-Modifikator für die suchbare Ansicht und dem Aufgabenmodifikator.
  • Rufen Sie eine Cloud Function auf, um mithilfe der aufrufbaren Schnittstelle des Firestore SDK eine semantische Suche in der Datenbank durchzuführen.

Mit dem Wissen, das Sie in diesem Codelab erworben haben, können Sie jetzt leistungsstarke Anwendungen erstellen, die die semantischen Suchfunktionen von Cloud Firestore nutzen, um Nutzern eine intuitivere und effizientere Suche zu bieten.

Weitere Informationen zum neuen Vektorfeld in Firestore und zum Berechnen von Vektoreinbettungen finden Sie in der Dokumentation.