Menambahkan Firestore Vector Search ke aplikasi seluler Anda dengan Firebase Extensions

1. Ringkasan

Dalam codelab ini, Anda akan mempelajari cara menambahkan fitur penelusuran yang canggih ke aplikasi menggunakan penelusuran kemiripan vektor Firestore. Anda akan menerapkan fitur penelusuran semantik untuk aplikasi pencatat yang ditulis dalam Swift dan SwiftUI.

Konsol Cloud Firestore menampilkan beberapa dokumen, yang juga terlihat di aplikasi iOS di sebelah kanan.

Yang akan Anda pelajari

  • Cara menginstal ekstensi Penelusuran Vektor dengan Firestore untuk menghitung penyematan vektor.
  • Cara memanggil Firebase Cloud Functions dari aplikasi Swift.
  • Cara memfilter data terlebih dahulu berdasarkan pengguna yang login.

Yang akan Anda perlukan

  • Xcode 15.3
  • Kode contoh codelab. Anda akan mendownloadnya di langkah berikutnya dalam codelab ini.

2. Membuat dan menyiapkan project Firebase

Untuk menggunakan ekstensi Firebase Vector Search, Anda memerlukan project Firebase. Di bagian codelab ini, Anda akan membuat project Firebase baru, dan mengaktifkan layanan yang diperlukan seperti Cloud Firestore dan Firebase Authentication.

Membuat project Firebase

  1. Login ke Firebase
  2. Di Firebase console, klik Tambahkan project, lalu beri nama project Anda Firestore Vector Search LabMembuat project, langkah 1 dari 3: memilih nama project
  3. Klik opsi pembuatan project. Setujui persyaratan Firebase jika diminta.
  4. Di layar Google Analytics, hapus centang pada kotak Enable Google Analytics for this project, karena Anda tidak akan menggunakan Analytics untuk aplikasi ini.
  5. Terakhir, klik Create project.

Untuk mempelajari project Firebase lebih lanjut, lihat Memahami project Firebase.

Mengupgrade paket harga Firebase Anda

Untuk menggunakan Firebase Extensions dan layanan cloud yang mendasarinya, project Firebase Anda harus menggunakan paket harga bayar sesuai pemakaian (Blaze), yang berarti project tersebut ditautkan ke akun Penagihan Cloud.

  • Akun Penagihan Cloud memerlukan metode pembayaran, seperti kartu kredit.
  • Jika Anda baru menggunakan Firebase dan Google Cloud, periksa apakah Anda memenuhi syarat untuk mendapatkan kredit sebesar$300 dan akun Penagihan Cloud Uji Coba Gratis.
  • Jika Anda melakukan codelab ini sebagai bagian dari acara, tanyakan kepada penyelenggara apakah ada kredit Cloud yang tersedia.

Untuk mengupgrade project Anda ke paket Blaze, ikuti langkah-langkah berikut:

  1. Di Firebase console, pilih upgrade your plan.
  2. Pilih paket Blaze. Ikuti petunjuk di layar untuk menautkan akun Penagihan Cloud ke project Anda.
    Jika perlu membuat akun Penagihan Cloud sebagai bagian dari upgrade ini, Anda mungkin perlu kembali ke alur upgrade di Firebase console untuk menyelesaikan upgrade.

Mengaktifkan dan menyiapkan produk Firebase di konsol

Aplikasi yang Anda build menggunakan beberapa produk Firebase yang tersedia untuk aplikasi Apple:

  • Firebase Authentication untuk memudahkan pengguna login ke aplikasi Anda.
  • Cloud Firestore untuk menyimpan data terstruktur di cloud dan mendapatkan notifikasi instan saat data berubah.
  • Aturan Keamanan Firebase untuk mengamankan database Anda.

Beberapa produk ini memerlukan konfigurasi khusus atau perlu diaktifkan menggunakan Firebase console.

Mengaktifkan autentikasi anonim untuk Firebase Authentication

Aplikasi ini menggunakan autentikasi anonim untuk memungkinkan pengguna mulai menggunakan aplikasi tanpa harus membuat akun terlebih dahulu. Hal ini menghasilkan proses orientasi yang mudah. Untuk mempelajari autentikasi anonim lebih lanjut (dan cara mengupgrade ke akun bernama), lihat Praktik Terbaik untuk autentikasi anonim.

  1. Di panel sebelah kiri Firebase console, klik Build > Authentication. Kemudian, klik Mulai.Mengaktifkan Firebase Authentication
  2. Anda sekarang berada di dasbor Autentikasi, tempat Anda dapat melihat pengguna yang terdaftar, mengonfigurasi penyedia login, dan mengelola setelan.
  3. Pilih tab Sign-in method (atau klik di sini untuk langsung membuka tab).
  4. Klik Anonymous dari opsi penyedia, alihkan tombol ke Enable, lalu klik Save.

Menyiapkan Cloud Firestore

Aplikasi Swift ini menggunakan Cloud Firestore untuk menyimpan catatan.

Berikut cara menyiapkan Cloud Firestore di project Firebase Anda:

  1. Di panel kiri Firebase console, luaskan Build, lalu pilih Firestore database.
  2. Klik Create database.
  3. Biarkan Database ID ditetapkan ke (default).
  4. Pilih lokasi untuk database Anda, lalu klik Berikutnya.
    Untuk aplikasi yang sebenarnya, Anda harus memilih lokasi yang dekat dengan pengguna.
  5. Klik Mulai dalam mode pengujian. Baca pernyataan penyangkalan tentang aturan keamanan.
    Di codelab ini, Anda akan menambahkan Aturan Keamanan untuk mengamankan data. Jangan mendistribusikan atau mengekspos aplikasi ke publik tanpa menambahkan Aturan Keamanan untuk database Anda.
  6. Klik Buat.

Menyiapkan Cloud Storage for Firebase

Aplikasi web menggunakan Cloud Storage for Firebase untuk menyimpan, mengupload, dan membagikan gambar.

Berikut cara menyiapkan Cloud Storage for Firebase di project Firebase Anda:

  1. Di panel kiri Firebase console, luaskan Build, lalu pilih Storage.
  2. Klik Mulai.
  3. Pilih lokasi untuk bucket Storage default Anda.
    Bucket di US-WEST1, US-CENTRAL1, dan US-EAST1 dapat memanfaatkan paket"Selalu Gratis" untuk Google Cloud Storage. Bucket di semua lokasi lainnya mengikuti harga dan penggunaan Google Cloud Storage.
  4. Klik Mulai dalam mode pengujian. Baca pernyataan penyangkalan tentang aturan keamanan.
    Di codelab ini, Anda akan menambahkan aturan keamanan untuk mengamankan data. Jangan mendistribusikan atau mengekspos aplikasi ke publik tanpa menambahkan Aturan Keamanan untuk bucket Storage Anda.
  5. Klik Buat.

3. Menghubungkan aplikasi seluler

Di bagian codelab ini, Anda akan mendownload kode sumber untuk aplikasi pencatat sederhana, dan menghubungkannya ke project Firebase yang baru saja Anda buat.

Unduh aplikasi contoh

  1. Buka https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios, lalu clone repositori ke komputer lokal Anda
  2. Buka project Notes.xcodeproj di Xcode

Menghubungkan aplikasi ke project Firebase Anda

Agar aplikasi dapat mengakses layanan Firebase, Anda harus menyiapkan aplikasi di Firebase console. Anda dapat menghubungkan beberapa aplikasi klien ke project Firebase yang sama, misalnya jika membuat aplikasi Android atau web, Anda harus menghubungkannya ke project Firebase yang sama.

Untuk mempelajari project Firebase lebih lanjut, lihat Memahami project Firebase.

  1. Di Firebase console, buka halaman ringkasan project Firebase Anda.Halaman ringkasan Firebase console
  2. Klik ikon iOS+ untuk menambahkan aplikasi iOS Anda.
  3. Di layar Add Firebase to your Apple app, masukkan ID paket dari project Xcode (com.google.firebase.codelab.Notes).
  4. Jika mau, Anda dapat memasukkan nama panggilan aplikasi (Catatan untuk iOS).
  5. Klik Register app untuk melanjutkan ke langkah berikutnya.
  6. Download file GoogleServices-Info.plist.
  7. Tarik GoogleServices-Info.plist ke folder Notes di project Xcode Anda. Cara terbaik untuk melakukannya adalah dengan meletakkannya di bawah file Assets.xcassets.Menarik file plist ke Xcode
  8. Pilih Salin item jika perlu, pastikan target Catatan dipilih di Tambahkan ke target, lalu klik Selesai.Memilih “Salin jika diperlukan” di dialog pilih opsi untuk menambahkan file
  9. Di Firebase console, Anda kini dapat mengklik proses penyiapan lainnya: contoh yang Anda download di awal bagian ini telah menginstal Firebase Apple SDK, dan inisialisasi telah disiapkan. Anda dapat menyelesaikan prosesnya dengan mengklik Lanjutkan ke konsol.

Menjalankan aplikasi

Sekarang saatnya mencoba aplikasi.

  1. Kembali ke Xcode, jalankan aplikasi di Simulator iOS. Di menu drop-down Run Destinations, pilih salah satu Simulator iOS terlebih dahulu.Memilih Simulator iOS di drop-down Run Destinations
  2. Kemudian, klik tombol Run, atau tekan ⌘ + R
  3. Setelah aplikasi berhasil diluncurkan di Simulator, tambahkan beberapa catatan.
  4. Di Firebase console, buka browser data Firestore, sehingga Anda dapat melihat dokumen baru yang dibuat saat menambahkan catatan baru di aplikasi.Konsol Cloud Firestore menampilkan beberapa dokumen, bersama dengan Simulator iOS yang menampilkan dokumen yang sama

4. Menginstal ekstensi Vector Search dengan Firestore

Di bagian codelab ini, Anda akan menginstal ekstensi Vector Search dengan Firestore, dan mengonfigurasinya sesuai dengan persyaratan aplikasi pencatat yang sedang Anda kerjakan.

Memulai penginstalan ekstensi

  1. Masih di bagian Firestore, klik tab Extensions.Memilih tab Firebase Extensions di konsol Firestore
  2. Klik Jelajahi Extensions Hub.Tab Firebase Extensions di konsol Firestore
  3. Ketik "vektor".
  4. Klik "Vector Search with Firestore extension".Halaman landing Firebase Extensions Hub Tindakan ini akan mengarahkan Anda ke halaman detail ekstensi, tempat Anda dapat membaca lebih lanjut tentang ekstensi, cara kerjanya, layanan Firebase yang diperlukan, dan cara mengonfigurasinya.
  5. Klik Install in Firebase console.Tombol instal untuk ekstensi Vector Search dengan Firestore
  6. Anda akan melihat daftar semua project Anda.
  7. Pilih project yang Anda buat pada langkah pertama codelab ini.Layar pemilih project Firebase

Mengonfigurasi ekstensi

  1. Tinjau API yang diaktifkan dan resource yang dibuat.Meninjau API yang diaktifkan
  2. Aktifkan layanan yang diperlukan.Mengaktifkan layanan yang diperlukan
  3. Setelah semua layanan diaktifkan, klik Berikutnya.Klik berikutnya setelah mengaktifkan semua layanan
  4. Tinjau akses yang diberikan untuk ekstensi ini.
  5. Konfigurasikan ekstensi:
    • Pilih Vertex AI sebagai LLM
    • Jalur koleksi: catatan
    • Batas kueri default: 3
    • Nama kolom input: text
    • Nama kolom output: embedding
    • Nama kolom status:* *status*
    • Sematkan dokumen yang ada: Ya
    • Memperbarui dokumen yang ada: Ya
    • Lokasi Cloud Function: us-central1
  6. Klik Instal ekstensi untuk menyelesaikan penginstalan.

Proses ini mungkin memerlukan waktu beberapa menit. Selagi menunggu penginstalan selesai, lanjutkan ke bagian tutorial berikutnya dan baca beberapa informasi latar belakang tentang embedding vektor.

5. Latar belakang

Selagi Anda menunggu penginstalan selesai, berikut beberapa informasi latar belakang tentang cara kerja ekstensi Vector Search dengan Firestore.

Apa yang dimaksud dengan Vektor, Embedding, dan Database Vektor?

  • Vektor adalah objek matematika yang mewakili besar dan arah suatu kuantitas. Diagram dapat digunakan untuk merepresentasikan data dengan cara yang memudahkan perbandingan dan penelusuran.
  • Embedding adalah vektor yang mewakili makna kata atau frasa. Model ini dibuat dengan melatih jaringan neural pada korpus teks yang besar dan mempelajari hubungan antarkata.
  • Database vektor adalah database yang dioptimalkan untuk menyimpan dan menelusuri data vektor. Hal ini memungkinkan penelusuran tetangga terdekat yang efisien, yaitu proses menemukan vektor yang paling mirip dengan vektor kueri tertentu.

Bagaimana cara kerja Penelusuran Vektor?

Penelusuran vektor berfungsi dengan membandingkan vektor kueri dengan semua vektor dalam database. Vektor yang paling mirip dengan vektor kueri akan ditampilkan sebagai hasil penelusuran.

Kemiripan antara dua vektor dapat diukur menggunakan berbagai metrik jarak. Metrik jarak yang paling umum adalah kesamaan kosinus, yang mengukur sudut antara dua vektor.

6. Mencoba ekstensi Penelusuran Vektor dengan Firestore

Sebelum menggunakan ekstensi Vector Search dengan Firestore di aplikasi iOS yang Anda download sebelumnya di codelab ini, Anda dapat mencoba ekstensi di Firebase console.

Baca dokumentasi

Firebase Extensions menyertakan dokumentasi tentang cara kerjanya.

  1. Setelah ekstensi selesai diinstal, klik tombol Mulai. Halaman ringkasan Firebase Extensions di Firebase console
  2. Lihat tab "Cara kerja ekstensi ini" - tab ini menjelaskan:
    • cara menghitung penyematan untuk dokumen dengan menambahkannya ke koleksi notes,
    • cara membuat kueri indeks dengan memanggil fungsi yang dapat dipanggil ext-firestore-vector-search-queryCallable,
    • atau cara membuat kueri indeks dengan menambahkan dokumen kueri ke koleksi _firestore-vector-search/index/queries.
    • Panduan ini juga menjelaskan cara menyiapkan fungsi penyematan kustom. Hal ini berguna jika tidak ada LLM yang didukung oleh ekstensi yang memenuhi persyaratan Anda, dan Anda ingin menggunakan LLM lain untuk menghitung penyematan. Dokumentasi untuk ekstensi Penelusuran Vektor dengan Firestore
  3. Klik link dasbor Cloud Firestore untuk membuka instance Firestore Anda
  4. Buka dokumen _firestore-vector-search/index. Tindakan ini akan menunjukkan bahwa ekstensi telah selesai menghitung penyematan untuk semua dokumen catatan yang Anda buat pada langkah sebelumnya dalam codelab ini.Konfigurasi indeks di dalam konsol Firestore
  5. Untuk memverifikasinya, buka salah satu dokumen catatan, dan Anda akan melihat kolom tambahan bernama embedding dari jenis vector<768>, serta kolom status.Kolom penyematan vektor di dalam konsol Firestore

Membuat contoh dokumen

Anda dapat membuat dokumen baru di Firebase console untuk melihat cara kerja ekstensi.

  1. Masih di browser data Firestore, buka koleksi notes dan klik + Tambahkan dokumen di kolom tengah.Menambahkan dokumen baru
  2. Klik Auto-ID untuk membuat ID dokumen unik baru.
  3. Tambahkan kolom bernama text dari jenis string, lalu tempelkan beberapa teks ke kolom value. Pastikan teks ini bukan lorem ipsum atau teks acak lainnya. Misalnya, pilih artikel berita.Menambahkan kolom teks
  4. Klik Simpan.
    • Perhatikan bagaimana ekstensi menambahkan kolom status untuk menunjukkan bahwa ekstensi sedang memproses data.
    • Setelah beberapa saat, Anda akan melihat kolom baru embedding dengan nilai vector<768>.
    Pembaruan status penyematan vektor untuk dokumen baru

Melakukan kueri

Ekstensi Vector Search dengan Firestore memiliki fitur kecil yang praktis yang memungkinkan Anda membuat kueri indeks dokumen tanpa harus menghubungkan aplikasi.

  1. Di bagian Firestore pada Firebase console, buka dokumen _firestore-vector-search/index
  2. Klik + Start collectionMenambahkan sub-koleksi baru
  3. Buat sub-koleksi baru bernama queries
  4. Buat dokumen baru dan tetapkan kolom query ke teks yang muncul di salah satu dokumen Anda. Hal ini berfungsi paling baik untuk kueri semantik, seperti "Bagaimana cara memetakan dokumen Firestore dengan Swift" (asalkan setidaknya salah satu catatan yang Anda tambahkan berisi teks yang membahas topik ini).Menambahkan kolom kueri
  5. Anda mungkin melihat error dalam statusTerjadi error
  6. Hal ini disebabkan oleh tidak adanya indeks. Untuk menyiapkan konfigurasi indeks yang tidak ada, buka konsol Google Cloud untuk project Anda dengan mengikuti link ini, lalu pilih project Anda dari daftarMemilih project yang benar
  7. Di Cloud Log Explorer, Anda sekarang akan melihat pesan error yang bertuliskan "FAILED_PRECONDITION: Konfigurasi indeks vektor tidak ada. Buat indeks yang diperlukan dengan perintah gcloud berikut: ..."Pesan error di penjelajah log
  8. Pesan error juga berisi perintah gcloud yang perlu Anda jalankan untuk mengonfigurasi indeks yang tidak ada.
  9. Jalankan perintah berikut dari command line Anda. Jika Anda belum menginstal gcloud CLI di komputer, ikuti petunjuk di sini untuk menginstalnya.
    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
    
    Pembuatan indeks memerlukan waktu beberapa menit. Anda dapat memeriksa progres di tab Indexes di bagian Firestore pada Firebase console.Status indeks baru
  10. Setelah indeks disiapkan, Anda dapat membuat dokumen kueri baru.
  11. Sekarang Anda akan melihat daftar ID dokumen yang cocok di kolom hasilHasil dari menjalankan kueri semantik
  12. Salin salah satu ID tersebut, lalu kembali ke koleksi notes.
  13. Gunakan ⌘+F untuk menelusuri ID dokumen yang Anda salin - dokumen ini adalah dokumen yang paling cocok dengan kueri Anda.Menemukan ID dokumen dalam daftar dokumen

7. Menerapkan penelusuran semantik

Akhirnya, saatnya menghubungkan aplikasi seluler Anda ke ekstensi Vector Search dengan Firestore dan menerapkan fitur penelusuran semantik yang akan memungkinkan pengguna menelusuri catatan mereka menggunakan kueri bahasa alami.

Menghubungkan fungsi callable untuk menjalankan kueri

Ekstensi Vector Search dengan Firestore menyertakan Cloud Function yang dapat Anda panggil dari aplikasi seluler untuk membuat kueri indeks yang Anda buat sebelumnya di codelab ini. Pada langkah ini, Anda akan membuat koneksi antara aplikasi seluler dan fungsi callable ini. Swift SDK Firebase menyertakan API yang membuat panggilan fungsi jarak jauh menjadi lancar.

  1. Kembali ke Xcode, dan pastikan Anda berada di project yang di-clone pada langkah sebelumnya di codelab ini.
  2. Buka file NotesRepository.swift.
  3. Menemukan baris yang berisi private lazy var vectorSearchQueryCallable: Callable = functions.httpsCallable("")

Untuk memanggil Cloud Function yang dapat dipanggil, Anda harus memberikan nama fungsi yang ingin dipanggil.

  1. Buka Firebase console untuk project Anda, lalu buka item menu Functions di bagian Build.
  2. Anda akan melihat daftar fungsi yang telah diinstal oleh ekstensi.
  3. Telusuri yang bernama ext-firestore-vector-search-queryCallable, lalu salin namanya.
  4. Tempel nama tersebut ke kode Anda. Sekarang, tampilannya akan menjadi
    private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    

Memanggil fungsi kueri

  1. Temukan metode performQuery
  2. Panggil fungsi callable Anda dengan memanggil
    let result = try await vectorSearchQueryCallable(searchTerm)
    

Karena ini adalah panggilan jarak jauh, panggilan tersebut mungkin akan gagal.

  1. Tambahkan beberapa penanganan error dasar untuk menangkap error dan mencatatnya ke konsol Xcode.
    private func performQuery(searchTerm: String) async -> [String] {
      do {
        let result = try await vectorSearchQueryCallable(searchTerm)
        return [result]
      }
      catch {
        print(error.localizedDescription)
        return []
      }
    }
    

Menghubungkan UI

Agar pengguna dapat menelusuri catatan mereka, Anda akan menerapkan kotak penelusuran di layar daftar catatan. Saat pengguna mengetik istilah penelusuran, Anda perlu memanggil metode performQuery yang diterapkan di langkah sebelumnya. Berkat pengubah tampilan searchable dan task yang disediakan oleh SwiftUI, hal ini hanya memerlukan beberapa baris kode.

  1. Pertama, buka NotesListScreen.swift
  2. Untuk menambahkan kotak penelusuran ke tampilan daftar, tambahkan pengubah tampilan .searchable(text: $searchTerm, prompt: "Search") tepat di atas baris .navigationTitle("Notes")
  3. Kemudian, panggil fungsi penelusuran dengan menambahkan kode berikut tepat di bawah:
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}

Cuplikan kode ini memanggil metode semanticSearch secara asinkron. Dengan memberikan waktu tunggu 800 milidetik, Anda menginstruksikan pengubah tugas untuk men-debounce input pengguna sebesar 0,8 detik. Artinya, semanticSearch hanya akan dipanggil setelah pengguna menjeda pengetikan selama lebih dari 0,8 detik.

Sekarang kode Anda akan terlihat seperti ini:

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

Menjalankan aplikasi

  1. Tekan ⌘ + R (atau klik tombol Run) untuk meluncurkan aplikasi di Simulator iOS
  2. Anda akan melihat catatan yang sama dengan yang ditambahkan di aplikasi sebelumnya dalam codelab ini, serta catatan yang ditambahkan melalui Firebase console
  3. Anda akan melihat kolom penelusuran di bagian atas daftar Catatan
  4. Ketik istilah yang muncul di salah satu dokumen yang Anda tambahkan. Sekali lagi, ini berfungsi paling baik untuk kueri semantik, seperti "Bagaimana cara memanggil Firebase API asinkron dari Swift" (asalkan setidaknya salah satu catatan yang Anda tambahkan berisi teks yang membahas topik ini).
  5. Anda mungkin berharap melihat hasil penelusuran, tetapi tampilan daftar kosong, dan konsol Xcode menampilkan pesan error: "Fungsi dipanggil dengan argumen yang tidak valid"

Aplikasi Catatan, dengan daftar hasil kosong

Artinya, Anda mengirim data dalam format yang salah.

Menganalisis pesan error

  1. Untuk mengetahui masalahnya, buka Firebase console
  2. Buka bagian Fungsi
  3. Temukan fungsi ext-firestore-vector-search-queryCallable, buka menu tambahan dengan mengklik tiga titik vertikal
  4. Pilih Lihat log untuk membuka Logs Explorer
  5. Anda akan melihat error
Unhandled error ZodError: [
  {
    "code": "invalid_type",
    "expected": "object",
    "received": "string",
    "path": [],
    "message": "Expected object, received string"
  }
]

Artinya, Anda mengirim data dalam format yang salah.

Menggunakan jenis data yang benar

Untuk mengetahui format yang diharapkan ekstensi untuk parameter, lihat dokumentasi ekstensi.

  1. Buka bagian Extensions di Firebase console
  2. Klik Kelola ->Mengelola ekstensi Penelusuran Vektor dengan Firestore
  3. Di bagian Cara kerja ekstensi ini, Anda akan menemukan spesifikasi parameter input dan output.Dokumentasi parameter input dan nilai hasil
  4. Kembali ke Xcode, lalu buka NotesRepository.swift
  5. Tambahkan kode berikut di awal 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 cocok dengan struktur parameter input yang diharapkan ekstensi, sesuai dengan dokumentasi ekstensi. File ini juga berisi atribut prefilter bertingkat yang akan Anda perlukan nanti.QueryResponse cocok dengan struktur respons ekstensi.
  6. Menemukan spesifikasi fungsi yang dapat dipanggil dan memperbarui jenis input dan output
    private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    
  7. Perbarui pemanggilan fungsi callable di 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 []
      }
    }
    

Menjalankan kembali aplikasi

  1. Menjalankan kembali aplikasi
  2. Mengetik kueri penelusuran yang berisi istilah yang disertakan dalam salah satu catatan Anda
  3. Anda sekarang akan melihat daftar catatan yang difilter

Screenshot aplikasi dengan hasil yang diharapkan

Pra-filter data pengguna

Sebelum Anda menari untuk merayakannya, ada masalah dengan versi aplikasi saat ini: set hasil berisi data dari semua pengguna.

Anda dapat memverifikasinya dengan menjalankan aplikasi di simulator lain dan menambahkan lebih banyak dokumen. Dokumen baru hanya akan muncul di simulator tersebut. Jika Anda menjalankan aplikasi lagi di simulator lain, Anda hanya akan melihat dokumen yang Anda buat pertama kali.

Jika melakukan penelusuran, Anda akan melihat bahwa panggilan ke vectorSearchQueryCallable menampilkan ID dokumen yang mungkin milik pengguna lain. Untuk mencegah hal ini, kita perlu menggunakan prafilter.

Di performQuery, perbarui kode Anda sebagai berikut:

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

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

Tindakan ini akan memfilter data terlebih dahulu berdasarkan ID pengguna yang login. Seperti yang Anda duga, tindakan ini memerlukan pembaruan indeks Firestore.

Jalankan perintah berikut dari command line untuk menentukan indeks Firestore baru yang menyertakan penyematan userId dan vektor di kolom 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

Setelah indeks selesai dibuat, jalankan kembali aplikasi untuk memverifikasi bahwa aplikasi berfungsi seperti yang diharapkan

Kumpulan hasil yang telah difilter sebelumnya

8. Selamat

Selamat, Anda telah berhasil menyelesaikan codelab ini.

Dalam codelab ini, Anda telah mempelajari cara:

  • Siapkan database Cloud Firestore dengan penelusuran semantik yang diaktifkan.
  • Buat aplikasi SwiftUI sederhana untuk berinteraksi dengan database.
  • Terapkan kotak penelusuran menggunakan pengubah tampilan yang dapat ditelusuri dan pengubah tugas SwiftUI.
  • Panggil Cloud Functions untuk melakukan penelusuran semantik di database, menggunakan antarmuka Callable Firestore SDK.

Dengan pengetahuan yang Anda peroleh dalam codelab ini, kini Anda dapat membuat aplikasi canggih yang memanfaatkan kemampuan penelusuran semantik Cloud Firestore untuk memberikan pengalaman penelusuran yang lebih intuitif dan efisien kepada pengguna.

Untuk mempelajari lebih lanjut kolom vektor baru Firestore dan cara menghitung penyematan vektor, lihat dokumentasi.