Dodaj wyszukiwanie wektorowe Firestore do swoich aplikacji mobilnych dzięki rozszerzeniom w Firebase

1. Przegląd

Z tego ćwiczenia w programie dowiesz się, jak dodać do aplikacji zaawansowane funkcje wyszukiwania przy użyciu wyszukiwania podobieństwa wektorów w Firestore. W aplikacji do notatek napisanej w językach Swift i SwiftUI wdrożysz funkcję wyszukiwania semantycznego.

Konsola Cloud Firestore przedstawiająca niektóre dokumenty, które są również widoczne po prawej stronie w aplikacji na iOS.

Czego się nauczysz

  • Jak zainstalować rozszerzenie Wyszukiwanie wektorowe z Firestore do obliczania wektorów dystrybucyjnych.
  • Wywoływanie funkcji Firebase Cloud Functions z aplikacji Swift.
  • Jak wstępnie przefiltrować dane według zalogowanego użytkownika.

Co będzie potrzebne

  • Xcode 15.3
  • Przykładowy kod ćwiczeń z programowania. Pobierzesz go w następnym kroku ćwiczenia z programowania.

2. Tworzenie i konfigurowanie projektu Firebase

Aby używać rozszerzenia Firebase Vector Search, musisz mieć projekt Firebase. W tej części ćwiczeń z programowania utworzysz nowy projekt Firebase i aktywujesz wymagane usługi, takie jak Cloud Firestore i Uwierzytelnianie Firebase.

Utwórz projekt Firebase

  1. Zaloguj się w Firebase.
  2. W konsoli Firebase kliknij Dodaj projekt, a następnie nazwij projekt Firestore Vector Search Lab.Utwórz projekt, krok 1 z 3. Wybierz nazwę projektu
  3. Przejdź do opcji tworzenia projektu. Jeśli pojawi się prośba, zaakceptuj warunki Firebase.
  4. Na ekranie Google Analytics odznacz pole Włącz Google Analytics w tym projekcie, ponieważ nie będziesz używać Analytics w tej aplikacji.
  5. Na koniec kliknij Utwórz projekt.

Więcej informacji o projektach Firebase znajdziesz w artykule Omówienie projektów Firebase.

Włączanie i konfigurowanie usług Firebase w konsoli

Aplikacja, którą tworzysz, korzysta z kilku usług Firebase dostępnych dla aplikacji Apple:

  • Uwierzytelnianie Firebase, aby ułatwić użytkownikom logowanie się w Twojej aplikacji.
  • Cloud Firestore – pozwala zapisywać uporządkowane dane w chmurze i otrzymywać natychmiastowe powiadomienia o zmianach danych.
  • Reguły zabezpieczeń Firebase do zabezpieczania bazy danych.

Niektóre z tych usług wymagają specjalnej konfiguracji lub trzeba je włączyć za pomocą konsoli Firebase.

Włącz anonimowe uwierzytelnianie Firebase

Ta aplikacja wykorzystuje uwierzytelnianie anonimowe, aby umożliwić użytkownikom rozpoczęcie korzystania z niej bez konieczności wcześniejszego utworzenia konta. Dzięki temu proces rejestracji przebiegnie bezproblemowo. Aby dowiedzieć się więcej o anonimowym uwierzytelnianiu (i o tym, jak przejść na nazwane konto), przeczytaj Sprawdzone metody uwierzytelniania anonimowego.

  1. W panelu bocznym po lewej stronie konsoli Firebase kliknij Tworzenie > Uwierzytelnianie. Następnie kliknij Rozpocznij.Włączam Autentyzację Firebase
  2. Zostanie otwarty panel uwierzytelniania, w którym możesz wyświetlać zarejestrowanych użytkowników, konfigurować dostawców logowania i zarządzać ustawieniami.
  3. Wybierz kartę Metoda logowania (lub kliknij tutaj, aby przejść bezpośrednio na nią).
  4. W opcjach dostawcy kliknij Anonimowe, ustaw przełącznik na Włącz i kliknij Zapisz.

Konfigurowanie Cloud Firestore

Ta aplikacja Swift zapisuje notatki za pomocą Cloud Firestore. Oto jak skonfigurować Cloud Firestore:

  1. W panelu bocznym po lewej stronie konsoli Firebase kliknij Kompilacja > Baza danych Firestore. Następnie kliknij Utwórz bazę danych.Włączam Cloud Firestore
  2. Wybierz lokalizację bazy danych, pamiętając, by wybrać lokalizację, w której usługa Gemini jest dostępna (możesz po prostu wybrać us-central1). Pamiętaj jednak, że tej lokalizacji nie można później zmienić. Kliknij Dalej.
  3. Wybierz opcję Uruchom w trybie testowym. Przeczytaj wyłączenie odpowiedzialności dotyczące reguł zabezpieczeń. Tryb testowy zapewnia możliwość swobodnego zapisu w bazie danych podczas programowania.Konfigurowanie reguł zabezpieczeń Firestore w trybie testowym
  4. Kliknij Utwórz, aby utworzyć bazę danych.

3. Połącz aplikację mobilną

W tej sekcji ćwiczeń z programowania pobierzesz kod źródłowy prostej aplikacji do sporządzania notatek i połączysz go z nowo utworzonym projektem Firebase.

Pobieranie przykładowej aplikacji

  1. Otwórz stronę https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios i skopiuj repozytorium na komputer lokalny.
  2. Otwórz projekt Notes.xcodeproj w Xcode

Połącz aplikację z projektem Firebase

Aby aplikacja miała dostęp do usług Firebase, musisz ją skonfigurować w konsoli Firebase. Z tym samym projektem Firebase możesz połączyć wiele aplikacji klienckich, np. jeśli tworzysz aplikację na Androida lub aplikację internetową, musisz je połączyć z tym samym projektem Firebase.

Więcej informacji o projektach Firebase znajdziesz w artykule Omówienie projektów Firebase.

  1. W konsoli Firebase otwórz stronę przeglądu swojego projektu Firebase.Strona przeglądu konsoli Firebase
  2. Kliknij ikonę iOS+, aby dodać aplikację na iOS.
  3. Na ekranie Dodaj Firebase do aplikacji Apple wstaw identyfikator pakietu z projektu Xcode (com.google.firebase.codelab.Notes).
  4. Jeśli chcesz, możesz wpisać własną nazwę aplikacji (Notatki na iOS).
  5. Aby przejść do następnego kroku, kliknij Zarejestruj aplikację.
  6. Pobierz plik GoogleServices-Info.plist.
  7. Przeciągnij plik GoogleServices-Info.plist do folderu Notes w projekcie Xcode. Dobrym sposobem jest upuszczenie jej pod plikiem Assets.xcassets.Przeciąganie pliku plist do Xcode
  8. Kliknij Skopiuj elementy w razie potrzeby, upewnij się, że w sekcji Dodaj do celów masz wybrane miejsce docelowe Notes, i kliknij Zakończ.w oknie wyboru opcji dodawania plików, wybierając „Kopiuj w razie potrzeby”.
  9. W konsoli Firebase możesz teraz przejść przez resztę procesu konfiguracji – w przykładzie pobranym na początku tej sekcji jest już zainstalowany pakiet Firebase Apple SDK i skonfigurowana inicjalizacja. Aby zakończyć ten proces, kliknij Przejdź do konsoli.

Uruchom aplikację

Czas przetestować aplikację!

  1. Wróć do Xcode i uruchom aplikację w symulatorze iOS. W menu Uruchom miejsca docelowe najpierw wybierz jeden z symulatorów iOS.Wybór symulatora iOS w menu „Miejsca docelowe uruchamiania”
  2. Następnie kliknij przycisk Uruchom lub naciśnij ⌘ + R.
  3. Gdy aplikacja uruchomi się w symulatorze, dodaj kilka informacji.
  4. W konsoli Firebase otwórz przeglądarkę danych Firestore, aby wyświetlać nowe dokumenty tworzone w miarę dodawania nowych notatek w aplikacji.Konsola Cloud Firestore z widocznymi dokumentami i symulatorem iOS, który pokazuje te same dokumenty.

4. Instalowanie wyszukiwania wektorowego z rozszerzeniem Firestore

W ramach tej części ćwiczeń z programowania zainstalujesz rozszerzenie Wyszukiwanie wektorowe z Firestore i skonfigurujesz je pod kątem wymagań aplikacji do sporządzania notatek, nad którą pracujesz.

Rozpocznij instalację rozszerzenia

  1. Będąc w sekcji Firestore, kliknij kartę Rozszerzenia.wybierając kartę Rozszerzenia Firebase w konsoli Firestore,
  2. Kliknij Przeglądaj centrum rozszerzeń.Karta Rozszerzenia w Firebase w konsoli Firestore
  3. Wpisz „vector”.
  4. Kliknij „Wyszukiwanie wektorowe z rozszerzeniem Firestore”.Strona docelowa Firebase Extensios Hub Otworzy się strona z informacjami o rozszerzeniu, na której znajdziesz więcej informacji o rozszerzeniu, jego działaniu, wymaganych usługach Firebase i sposobach ich konfiguracji.
  5. Kliknij Zainstaluj w konsoli Firebase.Przycisk instalacji dla wyszukiwania wektorowego z rozszerzeniem Firestore
  6. Wyświetli się lista wszystkich Twoich projektów.
  7. Wybierz projekt utworzony w pierwszym kroku tego ćwiczenia z programowania.Ekran wyboru projektu Firebase

Konfigurowanie rozszerzenia

Rozszerzenia w Firebase korzystają z funkcji Cloud Functions dla Firebase, co wymaga, by Twój projekt był objęty abonamentem Blaze (płatność według wykorzystania). Aby móc korzystać z rozszerzenia wyszukiwania wektorowego w Firestore, musisz uaktualnić projekt.

  1. Kliknij Uaktualnij projekt, aby kontynuować. Uaktualniam projekt do abonamentu Blaze
  2. Wybierz istniejące konto rozliczeniowe lub utwórz nowe. Kliknij Dalej.Wybieranie konta rozliczeniowego
  3. Ustal budżet (np. 10 PLN), kliknij Dalej, a potem Kup.Ustawienie budżetu
  4. Przejrzyj włączone interfejsy API i utworzone zasoby.Sprawdzanie włączonych interfejsów API
  5. Włącz wymagane usługi.Włączam wymagane usługi
  6. Włączając Cloud Storage, wybierz tryb testowy dla reguł zabezpieczeń.
  7. Sprawdź, czy Cloud Storage będzie używać tej samej lokalizacji co Twoja instancja Cloud Firestore.
  8. Po włączeniu wszystkich usług kliknij Dalej.Po włączeniu wszystkich usług kliknij Dalej
  9. Dostęp do sprawdzania tego rozszerzenia został przyznany.
  10. Skonfiguruj rozszerzenie:
    • Jako LLM wybierz Vertex AI.
    • Ścieżka zbierania danych: uwagi
    • Domyślny limit zapytań: 3
    • Nazwa pola do wprowadzania danych: text
    • Nazwa pola wyjściowego: umieszczanie
    • Status field name:* *status*
    • Umieść istniejące dokumenty: Tak
    • Zaktualizuj istniejące dokumenty: Tak
    • Lokalizacja funkcji w Cloud Functions: us-central1
  11. Kliknij Zainstaluj rozszerzenie, aby zakończyć instalację.

Może to potrwać kilka minut. Czekając na zakończenie instalacji, możesz przejść do następnej sekcji samouczka i przeczytać podstawowe informacje na temat reprezentacji właściwościowych wektorów.

5. Tło

Czekając na zakończenie instalacji, zapoznaj się z podstawowymi informacjami o działaniu narzędzia Wyszukiwanie wektorowe z rozszerzeniem Firestore.

Czym są wektory, elementy osadzone i bazy danych wektorowych?

  • Wektory to obiekty matematyczne, które reprezentują wielkość i kierunek liczby. Mogą one służyć do przedstawiania danych w sposób ułatwiający ich porównywanie i wyszukiwanie.
  • Osadzone elementy to wektory, które reprezentują znaczenie słowa lub wyrażenia. Powstają one przez trenowanie sieci neuronowej na dużym korpusie tekstu i uczenie się relacji między słowami.
  • Bazy danych wektorowych to bazy danych zoptymalizowane pod kątem przechowywania i wyszukiwania danych wektorowych. Umożliwiają one skuteczne wyszukiwanie najbliższych sąsiadów, czyli proces znajdowania wektorów najbardziej podobnych do danego wektora zapytania.

Jak działa wyszukiwanie wektorowe?

Wyszukiwanie wektorowe polega na porównywaniu wektorów zapytania ze wszystkimi wektorami w bazie danych. Wektory, które są najbardziej podobne do wektorów zapytania, są zwracane jako wyniki wyszukiwania.

Podobieństwo między dwoma wektorami można mierzyć za pomocą różnych danych dotyczących odległości. Najczęstszym wskaźnikiem odległości jest podobieństwo cosinusowe, które mierzy kąt między dwoma wektorami.

6. Wypróbuj wyszukiwanie wektorowe z rozszerzeniem Firestore

Zanim użyjesz rozszerzenia Wyszukiwanie wektorowe z Firestore w aplikacji na iOS pobranej wcześniej z tego ćwiczenia w Codelabs, możesz wypróbować to rozszerzenie w konsoli Firebase.

Przeczytaj dokumentację

Rozszerzenia w Firebase zawierają dokumentację dotyczącą ich działania.

  1. Po zakończeniu instalacji rozszerzenia kliknij przycisk Rozpocznij. Strona przeglądu Rozszerzeń w Firebase w konsoli Firebase
  2. Więcej informacji na ten temat znajdziesz na karcie „Jak działa to rozszerzenie”:
    • obliczać wektory dystrybucyjne dla dokumentów przez dodawanie ich do kolekcji notes,
    • jak utworzyć zapytanie o indeks, wywołując funkcję wywoływaną przez ext-firestore-vector-search-queryCallable,
    • lub jak wykonać zapytanie dotyczące indeksu, dodając dokument zapytania do kolekcji _firestore-vector-search/index/queries.
    • Wyjaśniono też, jak skonfigurować niestandardową funkcję umieszczania – jest to przydatne, jeśli żaden z LLM obsługiwanych przez rozszerzenie nie spełnia Twoich wymagań i chcesz użyć innego LLM do obliczenia reprezentacji właściwościowych. Dokumentacja rozszerzenia Wyszukiwanie wektorowe z użyciem Firestore
  3. Kliknij link do panelu Cloud Firestore, aby przejść do instancji Firestore.
  4. Przejdź do dokumentu _firestore-vector-search/index. Powinno to oznaczać, że rozszerzenie zakończyło obliczanie reprezentacji właściwościowych dla wszystkich dokumentów z notatkami utworzonych we wcześniejszym kroku tego ćwiczenia z programowania.Konfiguracja indeksu w konsoli Firestore
  5. Aby to sprawdzić, otwórz jeden z dokumentów z notatkami. Powinno pojawić się dodatkowe pole o nazwie embedding typu vector<768> oraz pole status.Pole osadzania wektorów w konsoli Firestore

Tworzenie przykładowego dokumentu

Możesz utworzyć nowy dokument w konsoli Firebase, aby zobaczyć, jak działa rozszerzenie.

  1. W przeglądarce danych Firestore przejdź do kolekcji notes i kliknij + Dodaj dokument w środkowej kolumnie.Dodawanie nowego dokumentu
  2. Kliknij Auto-ID, aby wygenerować nowy unikalny identyfikator dokumentu.
  3. Dodaj pole o nazwie text ciągu typu i wklej tekst w polu value (wartość). Ważne, aby nie było to lorem ipsum ani inny losowy tekst. Wybierz na przykład artykuł z wiadomościami.Dodawanie pola tekstowego
  4. Kliknij Zapisz.
    • Zwróć uwagę, że rozszerzenie dodaje pole stanu wskazujące, że przetwarza dane.
    • Po chwili powinno pojawić się nowe pole embedding z wartością vector<768>.
    Aktualizacja stanu wektorów dystrybucyjnych dla nowego dokumentu

Wykonywanie zapytania

Rozszerzenie Wyszukiwanie wektorowe z Firestore ma drobną funkcję, która umożliwia tworzenie zapytań dotyczących indeksu dokumentów bez konieczności łączenia się z aplikacją.

  1. W sekcji Firestore w konsoli Firebase otwórz dokument _firestore-vector-search/index.
  2. Kliknij + Rozpocznij kolekcję.Dodawanie nowej kolekcji podrzędnej
  3. Utwórz nową kolekcję podrzędną o nazwie queries
  4. Utwórz nowy dokument i w polu query wpisz tekst występujący w jednym z dokumentów. Sprawdza się to najlepiej w przypadku zapytań semantycznych, takich jak „Jak zmapować dokumenty Firestore przy użyciu Swift” (pod warunkiem, że co najmniej 1 z dodanych notatek zawiera tekst omawiający ten temat).Dodawanie pola zapytania
  5. W stanie może pojawić się błądWystąpił błąd
  6. Przyczyną jest brak indeksu. Aby skonfigurować brakującą konfigurację indeksu, przejdź do konsoli Google Cloud swojego projektu, klikając ten link i wybierając projekt z listy.Wybieranie odpowiedniego projektu
  7. W Eksploratorze logów Cloud powinien pojawić się komunikat o błędzie „FAILED_PRECondition: Brak konfiguracji indeksu wektorów”. Utwórz wymagany indeks za pomocą tego polecenia gcloud: ...”Komunikat o błędzie w eksploratorze logów
  8. Komunikat o błędzie zawiera też polecenie gcloud, które musisz uruchomić, aby skonfigurować brakujący indeks.
  9. Uruchom następujące polecenie z wiersza poleceń. Jeśli na komputerze nie masz zainstalowanego interfejsu wiersza poleceń gcloud, zainstaluj go, postępując zgodnie z tymi instrukcjami.
    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
    
    Tworzenie indeksu może potrwać kilka minut. Postęp możesz sprawdzić na karcie Indeksy w sekcji Firestore w konsoli Firebase.Stan nowego indeksu
  10. Po skonfigurowaniu indeksu możesz utworzyć nowy dokument zapytania.
  11. W polu wyników powinna być teraz widoczna lista pasujących identyfikatorów dokumentów.Wynik wykonywania zapytania semantycznego
  12. Skopiuj jeden z tych identyfikatorów i wróć do kolekcji notes.
  13. Naciśnij kombinację klawiszy ⌘+F, aby wyszukać skopiowany identyfikator dokumentu – to jest dokument, który najlepiej pasuje do zapytania.Znajdowanie identyfikatora dokumentu na liście dokumentów

7. Stosowanie wyszukiwania semantycznego

Czas połączyć swoją aplikację mobilną z rozszerzeniem Wyszukiwanie wektorowe w Firestore i wdrożyć funkcję wyszukiwania semantycznego, która umożliwi użytkownikom przeszukiwanie notatek przy użyciu zapytań w języku naturalnym.

Połącz funkcję wywoływaną na potrzeby wykonywania zapytań

Wyszukiwanie wektorowe z rozszerzeniem Firestore zawiera funkcję w Cloud Functions, którą możesz wywołać z aplikacji mobilnej, aby przesłać zapytanie do indeksu utworzonego wcześniej w ramach tego ćwiczenia z programowania. W tym kroku utworzysz połączenie między aplikacją mobilną a tą funkcją z możliwością wywołania. Pakiet Firebase Swift SDK zawiera interfejsy API, które ułatwiają wywoływanie funkcji zdalnych.

  1. Wróć do Xcode i sprawdź, czy jesteś w projekcie sklonowanym w poprzednim kroku tego ćwiczenia z programowania.
  2. Otwórz plik NotesRepository.swift.
  3. Znajdź wiersz zawierający ciąg private lazy var vectorSearchQueryCallable: Callable = functions.httpsCallable("")

Aby wywołać wywoływaną funkcję w Cloud Functions, musisz podać nazwę tej funkcji.

  1. Otwórz konsolę Firebase swojego projektu i w sekcji Tworzenie menu wybierz pozycję Funkcje.
  2. Pojawi się lista funkcji zainstalowanych przez to rozszerzenie.
  3. Wyszukaj hasło ext-firestore-vector-search-queryCallable i skopiuj jego nazwę.
  4. Wklej nazwę do kodu. Powinien zmienić się na
    private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    

Wywoływanie funkcji zapytania

  1. Znajdź metodę performQuery
  2. Wywołuj funkcję
    let result = try await vectorSearchQueryCallable(searchTerm)
    
    , aby wywołać funkcję

Jest to połączenie zdalne, więc może się nie udać.

  1. Dodaj podstawowe funkcje obsługi błędów, aby wychwytywać błędy i rejestrować je w konsoli Xcode.
    private func performQuery(searchTerm: String) async -> [String] {
      do {
        let result = try await vectorSearchQueryCallable(searchTerm)
        return [result]
      }
      catch {
        print(error.localizedDescription)
        return []
      }
    }
    

Łączenie z interfejsem

Aby umożliwić użytkownikom wyszukiwanie notatek, do ekranu z listą notatek dodano pasek wyszukiwania. Gdy użytkownik wpisze wyszukiwane hasło, musisz wywołać metodę performQuery zaimplementowaną w poprzednim kroku. Dzięki dostępnym w SwiftUI modyfikatorom widoku danych searchable i task wymaga to tylko kilku wierszy kodu.

  1. Najpierw otwórz aplikację NotesListScreen.swift
  2. Aby dodać pole wyszukiwania do widoku listy, dodaj modyfikator widoku .searchable(text: $searchTerm, prompt: "Search") tuż nad wierszem .navigationTitle("Notes")
  3. Następnie wywołaj funkcję wyszukiwania, dodając ten kod tuż poniżej:
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}

Ten fragment kodu asynchronicznie wywołuje metodę semanticSearch. Podając czas oczekiwania wynoszący 800 milisekund, określasz, że modyfikator zadań ma odciążyć dane wejściowe użytkownika o 0,8 sekundy. Oznacza to, że funkcja semanticSearch zostanie wywołana tylko wtedy, gdy użytkownik wstrzyma pisanie na ponad 0,8 sekundy.

Twój kod powinien teraz wyglądać tak:

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

Uruchom aplikację

  1. Naciśnij ⌘ + R (lub kliknij przycisk Uruchom), aby uruchomić aplikację w symulatorze iOS
  2. Powinny wyświetlić się te same notatki, które zostały dodane przez Ciebie wcześniej w tym ćwiczeniu z programowania, a także wszystkie notatki dodane w konsoli Firebase.
  3. U góry listy Notatki powinno pojawić się pole wyszukiwania.
  4. Wpisz hasło, które pojawi się w jednym z dodanych dokumentów. Również działa to najlepiej w przypadku zapytań semantycznych, takich jak „Jak wywołać asynchroniczne interfejsy API Firebase w Swift” (pod warunkiem, że co najmniej 1 z dodanych notatek zawiera tekst omawiający ten temat).
  5. Prawdopodobnie zobaczysz wynik wyszukiwania, ale widok listy jest pusty, a konsola Xcode wyświetla komunikat o błędzie: „Funkcja została wywołana z nieprawidłowym argumentem”.

Aplikacja Notatki z pustą listą wyników

Oznacza to, że dane zostały wysłane w złym formacie.

Analizowanie komunikatu o błędzie

  1. Aby sprawdzić, na czym polega problem, otwórz konsolę Firebase
  2. Przejdź do sekcji Funkcje.
  3. Znajdź funkcję ext-firestore-vector-search-queryCallable i otwórz rozszerzone menu, klikając 3 pionowe kropki.
  4. Wybierz Wyświetl logi, aby otworzyć eksplorator logów.
  5. Powinien pojawić się błąd
Unhandled error ZodError: [
  {
    "code": "invalid_type",
    "expected": "object",
    "received": "string",
    "path": [],
    "message": "Expected object, received string"
  }
]

Oznacza to, że dane zostały wysłane w złym formacie.

Używaj właściwych typów danych

Aby dowiedzieć się, w jakim formacie oczekuje rozszerzenie z parametrami, zapoznaj się z jego dokumentacją.

  1. Otwórz sekcję Rozszerzenia w konsoli Firebase.
  2. Kliknij Zarządzaj ->Zarządzanie wyszukiwaniem wektorowym za pomocą rozszerzenia Firestore.
  3. W sekcji Jak działa to rozszerzenie znajdziesz specyfikację parametrów wejściowych i wyjściowych.Dokumentacja parametru wejściowego i wartości wyniku
  4. Wróć do Xcode i przejdź do strony NotesRepository.swift
  5. Dodaj na początku pliku ten kod:
    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 pasuje do struktury parametru wejściowego oczekiwanego przez rozszerzenie, zgodnie z dokumentacją rozszerzenia. Zawiera też zagnieżdżony atrybut prefilter, który będzie potrzebny później.QueryResponse pasuje do struktury odpowiedzi rozszerzenia.
  6. Znajdź specyfikację funkcji wywoływanej i zaktualizuj typy danych wejściowych i wyjściowych
    private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    
  7. Zaktualizuj wywołanie funkcji możliwej do wywołania w 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 []
      }
    }
    

Ponownie uruchom aplikację

  1. Ponownie uruchom aplikację
  2. Wpisz zapytanie, które zawiera hasła znajdujące się w jednej z Twoich notatek
  3. Powinna być teraz widoczna przefiltrowana lista notatek

Zrzut ekranu aplikacji z oczekiwanym wynikiem

Wstępne filtrowanie danych użytkownika

Zanim upadniesz tańcem, aby uczcić tę okazję, wystąpił problem z bieżącą wersją aplikacji: zestaw wyników zawiera dane wszystkich użytkowników.

Możesz to sprawdzić, uruchamiając aplikację na innym symulatorze i dodając więcej dokumentów. Nowe dokumenty pojawią się tylko w tym symulatorze, jeśli ponownie uruchomisz aplikację za pomocą innego symulatora, a zobaczysz tylko dokumenty utworzone za pierwszym razem.

Po przeprowadzeniu wyszukiwania zauważysz, że wywołanie funkcji vectorSearchQueryCallable zwraca identyfikatory dokumentów, które mogą należeć do innego użytkownika. Aby temu zapobiec, musimy użyć filtra wstępnego.

W aplikacji performQuery zaktualizuj kod w ten sposób:

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

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

Spowoduje to wstępne przefiltrowanie danych na podstawie identyfikatora zalogowanego użytkownika, zgodnie z oczekiwaniami, wymaga to zaktualizowania indeksu Firestore.

Uruchom podane niżej polecenie z wiersza poleceń, aby zdefiniować nowy indeks Firestore, który zawiera w polu embedding wektory dystrybucyjne zarówno dla userId, jak i wektorów.

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

Po zakończeniu kompilowania indeksu ponownie uruchom aplikację, aby sprawdzić, czy działa prawidłowo.

Wstępnie przefiltrowany zestaw wyników

8. Gratulacje

Gratulacje! Udało Ci się ukończyć te ćwiczenia z programowania.

Dzięki tym ćwiczeniom z programowania dowiesz się, jak:

  • Skonfiguruj bazę danych Cloud Firestore z włączoną funkcją wyszukiwania semantycznego.
  • utworzyć prostą aplikację SwiftUI do interakcji z bazą danych,
  • Zaimplementuj pasek wyszukiwania przy użyciu modyfikatora widoku i mechanizmu zadania w interfejsie SwiftUI, które umożliwiają wyszukiwanie.
  • Wywołaj funkcję w Cloud Functions, aby przeprowadzić semantyczne wyszukiwanie w bazie danych przy użyciu interfejsu wywołań funkcji pakietu SDK Firestore.

Dzięki informacjom uzyskanym w ramach ćwiczeń z programowania możesz tworzyć zaawansowane aplikacje, które wykorzystują możliwości wyszukiwania semantycznego w Cloud Firestore, aby zapewnić użytkownikom bardziej intuicyjne i wydajne wyszukiwanie.

Więcej informacji o nowym polu wektorów w Firestore i sposobie obliczania wektorów dystrybucyjnych znajdziesz w dokumentacji.