Mit Firebase Extensions Firestore Vector Search in Ihre mobilen Apps einbinden

1. Übersicht

In diesem Codelab erfahren Sie, wie Sie Ihrer App mit der Firestore-Vektorähnlichkeitssuche leistungsstarke Suchfunktionen hinzufügen. Sie implementieren eine semantische Suchfunktion für eine Notizen-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

  • So installieren Sie die Vector Search with Firestore-Erweiterung, um Vektoreinbettungen zu berechnen.
  • Firebase Cloud Functions aus einer Swift-Anwendung aufrufen
  • Daten basierend auf dem angemeldeten Nutzer vorab filtern

Voraussetzungen

  • Xcode 15.3
  • Der Beispielcode für das Codelab. Sie laden sie in einem späteren Schritt des Codelabs herunter.

2. Firebase-Projekt erstellen und einrichten

Wenn Sie die Firebase Vector Search-Erweiterung verwenden möchten, 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 mit Ihrem Google-Konto in der Firebase Console an.
  2. Klicken Sie auf die Schaltfläche, um ein neues Projekt zu erstellen, und geben Sie dann einen Projektnamen ein (z. B. Firestore Vector Search Codelab).
  3. Klicken Sie auf Weiter.
  4. Lesen und akzeptieren Sie bei Aufforderung die Firebase-Nutzungsbedingungen und klicken Sie dann auf Weiter.
  5. (Optional) Aktivieren Sie die KI-Unterstützung in der Firebase Console (als „Gemini in Firebase“ bezeichnet).
  6. Für dieses Codelab benötigen Sie kein Google Analytics. Deaktivieren Sie daher die Google Analytics-Option.
  7. Klicken Sie auf Projekt erstellen, warten Sie, bis Ihr Projekt bereitgestellt wurde, und klicken Sie dann auf Weiter.

Weitere Informationen zu Firebase-Projekten

Firebase-Tarif upgraden

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

  • Für ein Cloud-Rechnungskonto ist eine Zahlungsmethode wie eine Kreditkarte erforderlich.
  • Wenn Sie neu bei Firebase und Google Cloud sind, können Sie prüfen, ob Sie Anspruch auf ein Guthaben von 300$und ein Cloud-Rechnungskonto für den kostenlosen Testzeitraum haben.
  • Wenn Sie dieses Codelab im Rahmen einer Veranstaltung durchführen, fragen Sie den Organisator, ob Cloud-Guthaben verfügbar ist.

So führen Sie für Ihr Projekt ein Upgrade auf den Tarif „Blaze“ durch:

  1. Wählen Sie in der Firebase Console die Option zum Upgraden Ihres Abos aus.
  2. Wählen Sie den Blaze-Tarif 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 zur Firebase-Konsole 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 Sichern Ihrer Datenbank.

Für einige dieser Produkte ist eine spezielle Konfiguration erforderlich oder sie müssen über die Firebase Console aktiviert werden.

Anonyme Authentifizierung für Firebase Authentication aktivieren

In dieser Anwendung wird die anonyme Authentifizierung verwendet, damit Nutzer die App verwenden können, ohne zuerst ein Konto erstellen zu müssen. Das führt zu einem 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 in der Firebase Console im linken Bereich auf Build > Authentifizierung. Klicken Sie dann auf Jetzt starten.Firebase Authentication aktivieren
  2. Sie befinden sich jetzt im Authentifizierungs-Dashboard. Dort können Sie registrierte Nutzer sehen, Anmeldeanbieter konfigurieren und Einstellungen verwalten.
  3. Wählen Sie den Tab 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 zum Speichern von Notizen.

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. Belassen Sie die Database ID (Datenbank-ID) auf (default).
  4. Wählen Sie einen Speicherort für Ihre Datenbank aus und klicken Sie auf Weiter.
    Für eine echte App sollten Sie einen Speicherort auswählen, der sich in der Nähe Ihrer Nutzer befindet.
  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. Veröffentlichen Sie eine App nicht öffentlich, ohne Sicherheitsregeln für Ihre Datenbank hinzuzufügen.
  6. Klicken Sie auf Erstellen.

Cloud Storage for Firebase einrichten

Die Web-App nutzt Cloud Storage for Firebase zum Speichern, Hochladen und Teilen von Bildern.

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

  1. Maximieren Sie im linken Bereich der Firebase Console Build und wählen Sie dann Storage aus.
  2. Klicken Sie auf Jetzt starten.
  3. Wählen Sie einen Standort für Ihren standardmäßigen Storage-Bucket aus.
    Für Buckets in US-WEST1, US-CENTRAL1 und US-EAST1 kann die kostenlose Stufe für Google Cloud Storage genutzt werden. Für Buckets an allen anderen Standorten gelten die Preise und die Nutzung von 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 Sie keine App öffentlich, ohne Sicherheitsregeln für Ihren Storage-Bucket hinzuzufügen.
  5. Klicken Sie auf Erstellen.

3. Mobile App verbinden

In diesem Abschnitt des Codelabs laden Sie den Quellcode für eine einfache Notiz-App herunter und verbinden ihn 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 verknüpfen. Wenn Sie beispielsweise eine Android- oder Web-App erstellen, sollten Sie sie mit demselben Firebase-Projekt verknüpfen.

Weitere Informationen zu Firebase-Projekten

  1. Rufen Sie in der Firebase Console die Übersichtsseite Ihres Firebase-Projekts auf.Übersichtsseite der Firebase Console
  2. Klicken Sie auf das Symbol „iOS+“, 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. Optional können Sie einen Alias für die App eingeben (z. B. 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. Am besten platzieren Sie sie unter der Datei Assets.xcassets.plist-Datei in Xcode ziehen
  8. Wählen Sie Elemente bei Bedarf kopieren aus, achten Sie darauf, dass das Ziel Notizen unter Zu Zielen hinzufügen ausgewählt ist, und klicken Sie auf Fertigstellen.„Bei Bedarf kopieren“ im Dialogfeld „Optionen zum Hinzufügen von Dateien auswählen“ auswählen
  9. In der Firebase Console können Sie jetzt den Rest des Einrichtungsvorgangs durchklicken: In dem Beispiel, das Sie am Anfang 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 auf dem iOS-Simulator aus. Wählen Sie im Drop-down-Menü Ziele ausführen zuerst einen der iOS-Simulatoren aus.Auswählen eines iOS-Simulators im Drop-down-Menü „Run Destinations“ (Ausführungsziele)
  2. Klicken Sie dann auf die Schaltfläche Ausführen oder drücken Sie ⌘ + R.
  3. Sobald die App erfolgreich auf dem Simulator gestartet wurde, fügen Sie einige Notizen hinzu.
  4. Rufen Sie in der Firebase Console den Firestore-Datenbrowser auf, damit Sie sehen können, wie neue Dokumente erstellt werden, wenn Sie in der App neue Notizen hinzufügen.Cloud Firestore-Konsole mit einigen Dokumenten neben dem iOS-Simulator, in dem dieselben Dokumente angezeigt werden

4. Vektorsuche mit Firestore-Erweiterung installieren

In diesem Teil des Codelabs installieren Sie die Erweiterung „Vektorsuche mit Firestore“ und konfigurieren sie entsprechend den Anforderungen der Notizen-App, an der Sie arbeiten.

Installation der Erweiterung starten

  1. Klicken Sie im Firestore-Bereich auf den Tab Erweiterungen.Wenn Sie in der Firestore Console den Tab „Firebase Extensions“ auswählen
  2. Klicken Sie auf Extensions Hub aufrufen.Tab „Firebase Extensions“ in der Firestore Console
  3. Geben Sie „Vektor“ ein.
  4. Klicken Sie auf „Vector Search with Firestore extension“ (Vector Search mit Firestore-Erweiterung).Die Landingpage des Firebase Extensions Hub Sie werden zur Detailseite der Erweiterung weitergeleitet. Dort finden Sie weitere Informationen zur Erweiterung, ihrer Funktionsweise, den erforderlichen Firebase-Diensten und zur Konfiguration.
  5. Klicken Sie auf In der Firebase Console installieren.Die Schaltfläche zum Installieren der Erweiterung „Vektorsuche mit Firestore“
  6. Sie sehen eine Liste aller Ihrer Projekte.
  7. Wählen Sie das Projekt aus, das Sie im ersten Schritt dieses Codelabs erstellt haben.Der Bildschirm zur Auswahl von Firebase-Projekten

Erweiterung konfigurieren

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

Das kann einige Minuten dauern. Während Sie warten, bis die Installation abgeschlossen ist, können Sie mit dem nächsten Abschnitt des Tutorials fortfahren und einige Hintergrundinformationen zu Vektoreinbettungen lesen.

5. Hintergrund

Während Sie warten, bis die Installation abgeschlossen ist, 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 Menge darstellen. Sie können verwendet werden, um Daten so darzustellen, dass sie leichter zu vergleichen und zu durchsuchen sind.
  • Einbettungen sind Vektoren, die die Bedeutung eines Worts oder einer Wortgruppe darstellen. Sie werden erstellt, indem ein neuronales Netzwerk mit einem großen Textkorpus trainiert wird und die Beziehungen zwischen Wörtern lernt.
  • 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, bei der die ähnlichsten Vektoren zu einem bestimmten Anfragevektor gefunden werden.

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 verschiedenen Distanzmesswerten gemessen werden. Der häufigste Distanzmesswert ist die Kosinus-Ähnlichkeit, mit der der Winkel zwischen zwei Vektoren gemessen wird.

6. Vektorsuche mit der Firestore-Erweiterung ausprobieren

Bevor Sie die Vector Search with Firestore-Erweiterung 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 der Erweiterung auf die Schaltfläche Jetzt loslegen. 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 abfragen, indem Sie die aufrufbare Funktion ext-firestore-vector-search-queryCallable aufrufen,
    • oder wie Sie den Index abfragen, indem Sie der _firestore-vector-search/index/queries-Sammlung 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 Ihren Anforderungen entspricht 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 _firestore-vector-search/index-Dokument auf. Dort sollte zu sehen sein, dass die Erweiterung die Einbettungen für alle Notizdokumente berechnet hat, die Sie in einem früheren Schritt dieses Codelabs erstellt haben.Indexkonfiguration in der Firestore Console
  5. Öffnen Sie eines der Notizdokumente, um dies zu überprüfen. Sie sollten ein zusätzliches Feld namens embedding vom Typ vector<768> sowie ein Feld status sehen.Ein Vektoreinbettungsfeld in der Firestore-Konsole

Beispieldokument erstellen

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

  1. Navigieren Sie im Firestore-Datenbrowser zur Sammlung notes 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 etwas Text in das Feld value 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.
    • Die Erweiterung fügt ein Statusfeld hinzu, um anzuzeigen, dass Daten verarbeitet werden.
    • Nach kurzer Zeit sollte ein neues Feld embedding mit dem Wert vector<768> angezeigt werden.
    Statusaktualisierung der Vektoreinbettungen für das neue Dokument

Abfrage ausführen

Die Vector Search with Firestore-Erweiterung bietet eine praktische Funktion, mit der Sie den Dokumentindex abfragen können, ohne eine App verbinden zu müssen.

  1. Rufen Sie in der Firebase Console im Bereich „Firestore“ das Dokument _firestore-vector-search/index auf.
  2. Klicken Sie auf + Sammlung starten.Neue untergeordnete Sammlung hinzufügen
  3. Erstellen Sie eine neue Unterkategorie mit dem Namen queries.
  4. Erstellen Sie ein neues Dokument und legen Sie für das Feld query einen Text fest, der in einem Ihrer Dokumente vorkommt. Das funktioniert am besten bei semantischen Anfragen wie „Wie kann ich Firestore-Dokumente mit Swift zuordnen?“, sofern mindestens eine der von Ihnen hinzugefügten Notizen Text zu diesem Thema enthält.Abfragefeld hinzufügen
  5. Möglicherweise wird im StatusEin Fehler ist aufgetretenein Fehler angezeigt.
  6. Das liegt an einem fehlenden Index. Um die fehlende Indexkonfiguration einzurichten, rufen Sie die Google Cloud Console für Ihr Projekt über diesen Link auf und wählen Sie Ihr Projekt aus der Liste ausDas richtige Projekt auswählen
  7. Im Cloud Log Explorer sollte jetzt eine Fehlermeldung angezeigt werden, die besagt, dass die Vektorkonfiguration fehlt: „FAILED_PRECONDITION: Missing vector index configuration. 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 den folgenden Befehl über die Befehlszeile aus. Wenn Sie die gcloud-CLI nicht auf Ihrem Computer installiert haben, 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. Den Fortschritt können Sie in der Firebase Console im Abschnitt „Firestore“ auf dem Tab Indexe prüfen.Status des neuen Index
  10. Nachdem der Index eingerichtet wurde, können Sie ein neues Abfragedokument erstellen.
  11. Im ErgebnisfeldErgebnis einer semantischen Abfragesollte nun eine Liste mit übereinstimmenden Dokument-IDs angezeigt werden.
  12. Kopieren Sie eine dieser IDs und kehren Sie zur Sammlung notes zurück.
  13. Suchen Sie mit ⌘+F nach der kopierten Dokument-ID. Dieses Dokument entspricht Ihrer Anfrage am besten.Dokument-ID in der Liste der Dokumente finden

7. Semantische Suche implementieren

Es ist endlich an der Zeit, Ihre mobile App mit der Erweiterung „Vector Search with Firestore“ zu verbinden und eine semantische Suchfunktion zu implementieren, mit der Ihre Nutzer ihre Notizen mithilfe von Anfragen in natürlicher Sprache durchsuchen können.

Aufrufbare Funktion zum Ausführen von Anfragen verbinden

Die Erweiterung „Vector Search with Firestore“ enthält eine Cloud-Funktion, die Sie aus Ihrer mobilen App 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, mit denen sich Remote-Funktionen nahtlos aufrufen lassen.

  1. Kehren Sie zu Xcode zurück und achten Sie darauf, dass Sie sich in dem Projekt befinden, das Sie in einem vorherigen Schritt dieses Codelabs 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 Functions-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 dem Gerät mit dem Namen ext-firestore-vector-search-queryCallable und kopieren Sie den Namen.
  4. Fügen Sie den Namen in Ihren Code ein. Es sollte nun
    private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    

Abfragefunktion aufrufen

  1. Methode performQuery suchen
  2. Rufen Sie Ihre aufrufbare Funktion auf, indem Sie
    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 Nutzer in ihren Notizen suchen können, müssen Sie auf dem Bildschirm mit der Notizenliste eine Suchleiste implementieren. Wenn der Nutzer einen Suchbegriff eingibt, müssen Sie die performQuery-Methode aufrufen, die Sie im vorherigen Schritt implementiert haben. Dank der von SwiftUI bereitgestellten Ansichtsmodifizierer 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 Ansichtsmodifikator .searchable(text: $searchTerm, prompt: "Search") direkt über der Zeile .navigationTitle("Notes") ein.
  3. Rufen Sie dann die Suchfunktion auf, indem Sie den folgenden Code direkt darunter einfügen:
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}

In diesem Code-Snippet wird die Methode semanticSearch asynchron aufgerufen. Durch die Angabe eines Zeitlimits von 800 Millisekunden weisen Sie den Aufgabenmodifikator an, die Eingabe des Nutzers um 0,8 Sekunden zu entprellen. Das bedeutet, dass semanticSearch erst aufgerufen wird, wenn der Nutzer länger als 0,8 Sekunden nicht mehr 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 der App in diesem Codelab 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 Anfragen wie „Wie kann ich asynchrone Firebase-APIs in Swift aufrufen?“, sofern mindestens eine der von Ihnen hinzugefügten Notizen Text zu diesem Thema enthält.
  5. Sie erwarten wahrscheinlich, dass das Suchergebnis angezeigt wird. Stattdessen ist die Listenansicht leer und in der Xcode-Konsole wird die Fehlermeldung „The function was called with an invalid argument“ (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. Um herauszufinden, was falsch ist, rufen Sie die Firebase Console auf.
  2. Gehen Sie zum Bereich Funktionen.
  3. Suchen Sie die Funktion ext-firestore-vector-search-queryCallable und öffnen Sie das Dreipunkt-Menü durch Klicken auf die drei vertikalen Punkte.
  4. Wählen Sie Logs 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

In der Dokumentation der Erweiterung finden Sie Informationen dazu, in welchem Format die Parameter angegeben werden müssen.

  1. Rufen Sie in der Firebase Console den Bereich Extensions auf.
  2. Klicken Sie auf Verwalten ->Verwaltung der Erweiterung „Vektorsuche mit Firestore“.
  3. Im Abschnitt So funktioniert diese Erweiterung finden Sie eine Spezifikation der Ein- und Ausgabeparameter.Dokumentation des Eingabeparameters und des Ergebniswerts
  4. Kehren Sie zu Xcode zurück und rufen Sie NotesRepository.swift auf.
  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 entspricht der Struktur des Eingabeparameters, den die Erweiterung gemäß der Dokumentation der Erweiterung erwartet. 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 aus einer Ihrer Notizen enthält.
  3. Sie sollten nun eine gefilterte Liste von Notizen sehen.

Screenshot der App mit dem erwarteten Ergebnis

Nutzerdaten vorfiltern

Bevor Sie einen Freudentanz aufführen, sollten Sie wissen, dass es ein Problem mit der aktuellen Version der App gibt: Die Ergebnismenge enthält Daten aller Nutzer.

Sie können dies überprüfen, indem Sie die App in 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 im anderen Simulator ausführen, sehen Sie nur die Dokumente, die Sie beim ersten Mal erstellt haben.

Wenn Sie eine Suche durchführen, werden Sie feststellen, 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 in performQuery Ihren Code 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 anhand der ID des angemeldeten Nutzers vorab gefiltert. Wie zu erwarten, muss der Firestore-Index aktualisiert werden.

Führen Sie den folgenden Befehl über die Befehlszeile aus, um einen neuen Firestore-Index zu definieren, der sowohl userId als auch die Vektoreinbettungen 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

Wenn der Index erstellt wurde, führen Sie die App noch einmal aus, um zu prüfen, ob sie wie erwartet funktioniert.

Vorab gefilterter Ergebnissatz

8. Glückwunsch

Herzlichen Glückwunsch zum erfolgreichen Abschluss dieses Codelabs!

In diesem Codelab haben Sie Folgendes gelernt:

  • Cloud Firestore-Datenbank mit aktivierter semantischer Suche einrichten
  • Erstellen Sie eine einfache SwiftUI-App für die Interaktion mit der Datenbank.
  • Implementieren Sie eine Suchleiste mit dem View-Modifikator „searchable“ von SwiftUI und dem Modifikator „task“.
  • Rufen Sie eine Cloud Functions-Funktion auf, um eine semantische Suche in der Datenbank durchzuführen. Verwenden Sie dazu die aufrufbare Schnittstelle des Firestore SDK.

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 ermöglichen.

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