Firebase Extensions ile mobil uygulamalarınıza Firestore Vektör Arama'yı ekleyin

1. Genel Bakış

Bu codelab'de, Firestore vektör benzerliği araması kullanarak uygulamanıza güçlü arama özellikleri eklemeyi öğreneceksiniz. Swift ve SwiftUI ile yazılmış bir not alma uygulaması için semantik arama özelliği uygulayacaksınız.

Bazı belgeleri gösteren Cloud Firestore konsolu. Bu belgeler sağ taraftaki iOS uygulamasında da görünür.

Öğrenecekleriniz

  • Vektör yerleştirmelerini hesaplamak için Firestore ile Vector Search uzantısını yükleme
  • Firebase Cloud Functions'ı Swift uygulamasından çağırma
  • Verileri, oturum açmış kullanıcıya göre önceden filtreleme

İhtiyacınız olanlar

  • Xcode 15.3
  • Codelab'in örnek kodu. Bu dosyayı, codelab'in sonraki bir adımında indireceksiniz.

2. Firebase projesi oluşturma ve ayarlama

Firebase Vector Search uzantısını kullanmak için bir Firebase projenizin olması gerekir. Bu kod laboratuvarının bu bölümünde yeni bir Firebase projesi oluşturacak ve Cloud Firestore ile Firebase Authentication gibi gerekli hizmetleri etkinleştireceksiniz.

Firebase projesi oluşturma

  1. Google Hesabınızı kullanarak Firebase konsolunda oturum açın.
  2. Yeni bir proje oluşturmak için düğmeyi tıklayın ve ardından bir proje adı girin (örneğin, Firestore Vector Search Codelab).
  3. Devam'ı tıklayın.
  4. İstenirse Firebase şartlarını inceleyip kabul edin ve Devam'ı tıklayın.
  5. (İsteğe bağlı) Firebase konsolunda yapay zeka yardımını etkinleştirin ("Firebase'de Gemini" olarak adlandırılır).
  6. Bu codelab için Google Analytics'e ihtiyacınız yoktur. Bu nedenle, Google Analytics seçeneğini devre dışı bırakın.
  7. Proje oluştur'u tıklayın, projenizin hazırlanmasını bekleyin ve ardından Devam'ı tıklayın.

Firebase projeleri hakkında daha fazla bilgi edinmek için Firebase projelerini anlama başlıklı makaleyi inceleyin.

Firebase fiyatlandırma planınızı yükseltme

Firebase Extensions'ı ve temel alınan bulut hizmetlerini kullanmak için Firebase projenizin kullandıkça öde (Blaze) fiyatlandırma planında olması gerekir. Bu da projenin bir Cloud Faturalandırma hesabına bağlı olduğu anlamına gelir.

Projenizi Blaze planına yükseltmek için şu adımları uygulayın:

  1. Firebase konsolunda planınızı yükseltmeyi seçin.
  2. Blaze planını seçin. Bir Cloud Faturalandırma hesabını projenize bağlamak için ekrandaki talimatları uygulayın.
    Bu yükseltme kapsamında bir Cloud Faturalandırma hesabı oluşturmanız gerekiyorsa yükseltmeyi tamamlamak için Firebase Console'daki yükseltme akışına geri dönmeniz gerekebilir.

Konsolda Firebase ürünlerini etkinleştirme ve ayarlama

Geliştirdiğiniz uygulama, Apple uygulamaları için kullanılabilen çeşitli Firebase ürünlerini kullanıyor:

  • Kullanıcılarınızın uygulamanızda kolayca oturum açmasına olanak tanımak için Firebase Authentication.
  • Yapılandırılmış verileri bulutta kaydetmek ve veriler değiştiğinde anında bildirim almak için Cloud Firestore.
  • Veritabanınızı güvenli hale getirmek için Firebase Güvenlik Kuralları'nı kullanın.

Bu ürünlerden bazıları özel yapılandırma gerektirir veya Firebase konsolu kullanılarak etkinleştirilmelidir.

Firebase Authentication için anonim kimlik doğrulamayı etkinleştirme

Bu uygulama, kullanıcıların önce hesap oluşturmak zorunda kalmadan uygulamayı kullanmaya başlamasına olanak tanımak için anonim kimlik doğrulama kullanır. Bu sayede, sorunsuz bir oryantasyon süreci sağlanır. Anonim kimlik doğrulama (ve adlandırılmış hesaba yükseltme) hakkında daha fazla bilgi edinmek için Anonim kimlik doğrulama için en iyi uygulamalar başlıklı makaleyi inceleyin.

  1. Firebase konsolunun sol tarafındaki panelde Build > Authentication'ı (Oluştur > Kimlik Doğrulama) tıklayın. Ardından Başlayın'ı tıklayın.Firebase Authentication'ı etkinleştirme
  2. Artık kayıtlı kullanıcıları görebileceğiniz, oturum açma sağlayıcılarını yapılandırabileceğiniz ve ayarları yönetebileceğiniz Kimlik Doğrulama kontrol panelindesiniz.
  3. Oturum açma yöntemi sekmesini seçin (veya doğrudan sekmeye gitmek için burayı tıklayın).
  4. Sağlayıcı seçeneklerinden Anonim'i tıklayın, anahtarı Etkinleştir konumuna getirin ve Kaydet'i tıklayın.

Cloud Firestore'u ayarlama

Bu Swift uygulaması, notları kaydetmek için Cloud Firestore'u kullanır.

Firebase projenizde Cloud Firestore'u nasıl ayarlayacağınız aşağıda açıklanmıştır:

  1. Firebase konsolunun sol panelinde Build'i (Oluştur) genişletin ve Firestore database'i (Firestore veritabanı) seçin.
  2. Create database'i (Veritabanı oluştur) tıklayın.
  3. Veritabanı Kimliği'ni (default) olarak bırakın.
  4. Veritabanınız için bir konum seçin ve Sonraki'yi tıklayın.
    Gerçek bir uygulama için kullanıcılarınıza yakın bir konum seçmeniz gerekir.
  5. Test modunda başlat'ı tıklayın. Güvenlik kurallarıyla ilgili sorumluluk reddi beyanını okuyun.
    Bu codelab'in ilerleyen bölümlerinde, verilerinizin güvenliğini sağlamak için güvenlik kuralları ekleyeceksiniz. Veritabanınıza güvenlik kuralları eklemeden uygulamayı herkese açık şekilde dağıtmayın veya herkese açık olarak kullanıma sunmayın.
  6. Oluştur'u tıklayın.

Cloud Storage for Firebase'i kurma

Web uygulaması, resimleri depolamak, yüklemek ve paylaşmak için Cloud Storage for Firebase'i kullanır.

Firebase projenizde Cloud Storage for Firebase'i ayarlamak için:

  1. Firebase konsolunun sol panelinde Build'i (Oluştur) genişletin ve Storage'ı (Depolama) seçin.
  2. Başlayın'ı tıklayın.
  3. Varsayılan depolama paketinize bir konum seçin.
    US-WEST1, US-CENTRAL1 ve US-EAST1 bölgelerindeki paketler, Google Cloud Storage için "Daima Ücretsiz" katmanından yararlanabilir. Diğer tüm konumlardaki paketler için Google Cloud Storage fiyatlandırması ve kullanımı geçerlidir.
  4. Test modunda başlat'ı tıklayın. Güvenlik kurallarıyla ilgili sorumluluk reddi beyanını okuyun.
    Bu codelab'in ilerleyen bölümlerinde, verilerinizin güvenliğini sağlamak için güvenlik kuralları ekleyeceksiniz. Depolamapaketinize güvenlik kuralları eklemeden uygulamayı herkese açık olarak dağıtmayın veya kullanıma sunmayın.
  5. Oluştur'u tıklayın.

3. Mobil uygulamayı bağlama

Bu codelab bölümünde, basit bir not alma uygulaması için kaynak kodu indirecek ve bu kodu yeni oluşturduğunuz Firebase projesine bağlayacaksınız.

Örnek uygulamayı indirin

  1. https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios adresine gidin ve kod deposunu yerel makinenize klonlayın
  2. Xcode'da Notes.xcodeproj projesini açın.

Uygulamayı Firebase projenize bağlayın

Uygulamanızın Firebase hizmetlerine erişebilmesi için uygulamayı Firebase konsolunda ayarlamanız gerekir. Aynı Firebase projesine birden fazla istemci uygulaması bağlayabilirsiniz. Örneğin, bir Android veya web uygulaması oluşturursanız bunları aynı Firebase projesine bağlamanız gerekir.

Firebase projeleri hakkında daha fazla bilgi edinmek için Firebase projelerini anlama başlıklı makaleyi inceleyin.

  1. Firebase konsolunda Firebase projenizin genel bakış sayfasına gidin.Firebase konsolunun genel bakış sayfası
  2. iOS uygulamanızı eklemek için iOS+ simgesini tıklayın.
  3. Add Firebase to your Apple app (Firebase'i Apple uygulamanıza ekleme) ekranında, Xcode projesindeki paket kimliğini (com.google.firebase.codelab.Notes) ekleyin.
  4. Dilerseniz uygulama takma adı (ör. iOS için Notlar) girebilirsiniz.
  5. Sonraki adıma geçmek için Uygulamayı kaydet'i tıklayın.
  6. GoogleServices-Info.plist dosyasını indirin.
  7. GoogleServices-Info.plist dosyasını Xcode projenizin Notes klasörüne sürükleyin. Bunu yapmanın iyi bir yolu, dosyayı Assets.xcassets dosyasının altına bırakmaktır.Plist dosyasını Xcode'a sürükleme
  8. Gerekirse öğeleri kopyala'yı seçin, Hedeflere ekle'de Notlar hedefinin seçildiğinden emin olun ve Bitir'i tıklayın.Dosya ekleme iletişim kutusunda "Gerekirse kopyala"yı seçme
  9. Firebase konsolunda, kurulum sürecinin geri kalanını tamamlayabilirsiniz. Bu bölümün başında indirdiğiniz örnekte Firebase Apple SDK'sı zaten yüklü ve başlatma ayarları yapılmış durumda. Konsola git'i tıklayarak işlemi tamamlayabilirsiniz.

Uygulamayı çalıştırma

Artık uygulamayı deneme zamanı geldi.

  1. Xcode'a geri dönün ve uygulamayı iOS simülatöründe çalıştırın. Run Destinations (Çalıştırma Hedefleri) açılır listesinde önce iOS simülatörlerinden birini seçin.Çalıştırma Hedefleri açılır listesinde bir iOS simülatörü seçme
  2. Ardından, Çalıştır düğmesini tıklayın veya ⌘ + R tuşlarına basın.
  3. Uygulama Simülatör'de başarıyla başlatıldıktan sonra birkaç not ekleyin.
  4. Firebase konsolunda Firestore veri tarayıcısına gidin. Böylece, uygulamaya yeni notlar eklerken oluşturulan yeni belgeleri görebilirsiniz.Bazı dokümanları gösteren Cloud Firestore konsolu ve aynı dokümanları gösteren iOS Simülatörü

4. Vector Search with Firestore uzantısını yükleyin

Bu codelab'in bu bölümünde, Vector Search with Firestore uzantısını yükleyecek ve üzerinde çalıştığınız not alma uygulamasının gereksinimlerine göre yapılandıracaksınız.

Uzantıyı yüklemeyi başlatma

  1. Firestore bölümünde Uzantılar sekmesini tıklayın.Firestore konsolunda Firebase Uzantıları sekmesini seçme
  2. Uzantı Merkezi'ni keşfedin'i tıklayın.Firestore konsolundaki Firebase Extensions sekmesi
  3. "Vektör" yazın.
  4. "Vector Search with Firestore extension"ı (Firestore uzantısıyla Vector Search) tıklayın.Firebase Extensions Hub açılış sayfası Bu işlem sizi uzantının ayrıntılar sayfasına yönlendirir. Burada uzantı, işleyiş şekli, hangi Firebase hizmetlerini gerektirdiği ve nasıl yapılandırabileceğiniz hakkında daha fazla bilgi edinebilirsiniz.
  5. Firebase konsoluna yükle'yi tıklayın.Firestore ile Vector Search uzantısının yükleme düğmesi
  6. Tüm projelerinizin listesi gösterilir.
  7. Bu codelab'in ilk adımında oluşturduğunuz projeyi seçin.Firebase proje seçici ekranı

Uzantıyı yapılandırma

  1. Etkinleştirilen API'leri ve oluşturulan kaynakları inceleyin.Etkinleştirilen API'leri inceleme
  2. Gerekli hizmetleri etkinleştirin.Gerekli hizmetleri etkinleştirme
  3. Tüm hizmetler etkinleştirildikten sonra Sonraki'yi tıklayın.Tüm hizmetleri etkinleştirdikten sonra İleri'yi tıklayın.
  4. Bu uzantıya inceleme erişimi verildi.
  5. Uzantıyı yapılandırın:
    • LLM olarak Vertex AI'ı seçin.
    • Toplama yolu: notlar
    • Varsayılan sorgu sınırı: 3
    • Giriş alanı adı: text
    • Çıkış alanı adı: embedding
    • Durum alanı adı:* *status*
    • Mevcut dokümanları yerleştirme: Evet
    • Mevcut dokümanları güncelleme: Evet
    • Cloud Function konumu: us-central1
  6. Yüklemeyi tamamlamak için Uzantıyı yükle'yi tıklayın.

Bu işlem birkaç dakika sürebilir. Kurulumun tamamlanmasını beklerken eğitimin bir sonraki bölümüne geçebilir ve Vector Embedding'ler hakkında bazı temel bilgileri okuyabilirsiniz.

5. Arka plan

Kurulumun tamamlanmasını beklerken Firestore ile Vektör Arama uzantısının nasıl çalıştığı hakkında bazı temel bilgileri aşağıda bulabilirsiniz.

Vektörler, yerleştirmeler ve vektör veritabanları nedir?

  • Vektörler, bir miktarın büyüklüğünü ve yönünü temsil eden matematiksel nesnelerdir. Verileri karşılaştırmayı ve aramayı kolaylaştıracak şekilde temsil etmek için kullanılabilirler.
  • Yerleştirmeler, bir kelimenin veya kelime öbeğinin anlamını temsil eden vektörlerdir. Bu modeller, bir nöral ağı büyük bir metin külliyatı üzerinde eğiterek ve kelimeler arasındaki ilişkileri öğrenerek oluşturulur.
  • Vektör veritabanları, vektör verilerini depolamak ve aramak için optimize edilmiş veritabanlarıdır. Bu vektörler, belirli bir sorgu vektörüne en benzer vektörleri bulma işlemi olan verimli en yakın komşu aramasına olanak tanır.

Vektör araması nasıl çalışır?

Vektör araması, sorgu vektörünü veritabanındaki tüm vektörlerle karşılaştırarak çalışır. Sorgu vektörüne en çok benzeyen vektörler, arama sonuçları olarak döndürülür.

İki vektör arasındaki benzerlik, çeşitli mesafe metrikleri kullanılarak ölçülebilir. En yaygın uzaklık metriği, iki vektör arasındaki açıyı ölçen kosinüs benzerliğidir.

6. Vector Search with Firestore uzantısını deneyin

Bu codelab'in başında indirdiğiniz iOS uygulamasında Firestore ile Vector Search uzantısını kullanmadan önce uzantıyı Firebase konsolunda deneyebilirsiniz.

Belgeleri okuyun

Firebase Extensions'ın nasıl çalıştığıyla ilgili belgeler bulunur.

  1. Uzantı yükleme işlemi tamamlandıktan sonra Başlayın düğmesini tıklayın. Firebase konsolundaki Firebase Extension'a genel bakış sayfası
  2. "Bu uzantının çalışma şekli" sekmesine göz atın. Bu sekmede şu bilgiler açıklanır:
    • notes koleksiyonuna ekleyerek dokümanlar için yerleştirmeleri hesaplama,
    • ext-firestore-vector-search-queryCallable çağrılabilir işlevini çağırarak dizine nasıl sorgu göndereceğinizi,
    • veya _firestore-vector-search/index/queries koleksiyonuna bir sorgu dokümanı ekleyerek dizine nasıl sorgu göndereceğinizi öğrenin.
    • Ayrıca, uzantı tarafından desteklenen LLM'lerin hiçbiri gereksinimlerinizi karşılamıyorsa ve yerleştirilmiş öğeleri hesaplamak için farklı bir LLM kullanmak istiyorsanız özel yerleştirilmiş öğe işlevinin nasıl ayarlanacağı da açıklanmaktadır. Firestore ile Vector Search uzantısının dokümanları
  3. Firestore örneğinize gitmek için Cloud Firestore kontrol paneli bağlantısını tıklayın.
  4. _firestore-vector-search/index dokümanına gidin. Uzantının, bu codelab'in önceki adımında oluşturduğunuz tüm not belgeleri için yerleştirmeleri hesaplamayı tamamladığını gösterir.Firestore konsolundaki dizin yapılandırması
  5. Bunu doğrulamak için not belgelerinden birini açın. embedding türünde vector<768> adlı ek bir alanın yanı sıra bir status alanı görmeniz gerekir.Firestore konsolunda vektör yerleştirme alanı

Örnek doküman oluşturma

Uzantıyı çalışırken görmek için Firebase konsolunda yeni bir belge oluşturabilirsiniz.

  1. Firestore veri tarayıcısında notes koleksiyonuna gidin ve orta sütunda + Belge ekle'yi tıklayın.Yeni doküman ekleme
  2. Yeni bir benzersiz belge kimliği oluşturmak için Otomatik kimlik'i tıklayın.
  3. text adlı bir dize türü alan ekleyin ve value alanına biraz metin yapıştırın. Bu metnin lorem ipsum veya başka bir rastgele metin olmaması önemlidir. Örneğin, bir haber makalesi seçin.Metin alanı ekleme
  4. Kaydet'i tıklayın.
    • Uzantının, verileri işlediğini belirtmek için nasıl bir durum alanı eklediğine dikkat edin.
    • Kısa bir süre sonra, değeri vector<768> olan yeni bir alan embedding görmeniz gerekir.
    Yeni doküman için vektör yerleştirmeleri durumu güncellemesi

Sorgu yapma

Firestore ile Vektör Arama uzantısı, bir uygulamayı bağlamanıza gerek kalmadan belge dizinini sorgulamanıza olanak tanıyan kullanışlı bir özelliğe sahiptir.

  1. Firebase konsolunun Firestore bölümünde _firestore-vector-search/index dokümanına gidin.
  2. + Koleksiyon oluştur'u tıklayın.Yeni alt koleksiyon ekleme
  3. queries adlı yeni bir alt koleksiyon oluşturun.
  4. Yeni bir doküman oluşturun ve query alanını dokümanlarınızdan birinde geçen bir metin olarak ayarlayın. Bu özellik en iyi şekilde, "Firestore belgelerini Swift ile nasıl eşleyebilirim?" gibi semantik sorgular için çalışır (eklediğiniz notlardan en az biri bu konuyu ele alan metinler içeriyorsa).Sorgu alanı ekleme
  5. Durumda bir hata görebilirsiniz.Bir hata oluştu
  6. Bu durum, dizinin eksik olmasından kaynaklanır. Eksik dizin yapılandırmasını ayarlamak için bu bağlantıyı izleyerek projenizin Google Cloud Console'una gidin ve listeden projenizi seçinDoğru projeyi seçme
  7. Cloud Log Explorer'da artık "FAILED_PRECONDITION: Missing vector index configuration. Lütfen aşağıdaki gcloud komutuyla gerekli dizini oluşturun: ..."Günlük Gezgini&#39;ndeki hata mesajı
  8. Hata mesajında, eksik dizini yapılandırmak için çalıştırmanız gereken bir gcloud komutu da bulunur.
  9. Komut satırınızda aşağıdaki komutu çalıştırın. Makinenizde gcloud CLI yüklü değilse yüklemek için buradaki talimatları uygulayın.
    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
    
    Dizinin oluşturulması birkaç dakika sürer. İlerleme durumunu Firebase konsolunun Firestore bölümündeki Dizinler sekmesinden kontrol edebilirsiniz.Yeni dizinin durumu
  10. Dizin oluşturulduktan sonra yeni bir sorgu dokümanı oluşturabilirsiniz.
  11. Sonuçlar alanında eşleşen doküman kimliklerinin listesini görürsünüzSemantik sorgu gerçekleştirme sonucu.
  12. Bu kimliklerden birini kopyalayın ve notes koleksiyonuna geri dönün.
  13. Kopyaladığınız belge kimliğini aramak için ⌘+F tuşlarını kullanın. Bu belge, sorgunuzla en iyi eşleşen belgedir.Doküman listesinde doküman kimliğini bulma

7. Semantik aramayı uygulama

Sonunda mobil uygulamanızı Vector Search with Firestore uzantısına bağlamanın ve kullanıcılarınızın notlarını doğal dil sorgularıyla aramasına olanak tanıyan bir anlamsal arama özelliği uygulamanın zamanı geldi.

Sorgu gerçekleştirme için çağrılabilir işlevi bağlayın

Firestore ile Vector Search uzantısı, bu codelab'de daha önce oluşturduğunuz dizine sorgu göndermek için mobil uygulamanızdan çağırabileceğiniz bir Cloud Function içerir. Bu adımda, mobil uygulamanız ile bu çağrılabilir işlev arasında bir bağlantı oluşturacaksınız. Firebase'in Swift SDK'sında, uzak işlevleri sorunsuz bir şekilde çağırmayı sağlayan API'ler bulunur.

  1. Xcode'a geri dönün ve bu codelab'in önceki bir adımında klonladığınız projede olduğunuzdan emin olun.
  2. NotesRepository.swift dosyasını açın.
  3. private lazy var vectorSearchQueryCallable: Callable = functions.httpsCallable("") içeren satırı bulun.

Çağrılabilir bir Cloud Functions işlevini çağırmak için çağırmak istediğiniz işlevin adını sağlamanız gerekir.

  1. Projenizin Firebase konsoluna gidin ve Oluştur bölümünde İşlevler menü öğesini açın.
  2. Uzantı tarafından yüklenen işlevlerin listesini görürsünüz.
  3. ext-firestore-vector-search-queryCallable adlı olanı arayın ve adını kopyalayın.
  4. Adı kodunuza yapıştırın. Şimdi şu şekilde okunmalıdır:
    private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    

Sorgu işlevini çağırma

  1. Yöntemi bulma performQuery
  2. Çağrılabilir işlevinizi çağırarak çağırın.
    let result = try await vectorSearchQueryCallable(searchTerm)
    

Bu uzak bir görüşme olduğundan başarısız olabilir.

  1. Hataları yakalamak ve bunları Xcode'un konsoluna kaydetmek için temel hata işleme işlevleri ekleyin.
    private func performQuery(searchTerm: String) async -> [String] {
      do {
        let result = try await vectorSearchQueryCallable(searchTerm)
        return [result]
      }
      catch {
        print(error.localizedDescription)
        return []
      }
    }
    

Kullanıcı arayüzünü bağlama

Kullanıcıların notlarını arayabilmesi için not listesi ekranına bir arama çubuğu ekleyeceksiniz. Kullanıcı bir arama terimi yazdığında, önceki adımda uyguladığınız performQuery yöntemini çağırmanız gerekir. SwiftUI'ın sağladığı searchable ve task görünüm değiştiriciler sayesinde bu işlem için yalnızca birkaç satır kod gerekir.

  1. Öncelikle NotesListScreen.swift
  2. Liste görünümüne arama kutusu eklemek için .searchable(text: $searchTerm, prompt: "Search") görünüm değiştiricisini .navigationTitle("Notes") satırının hemen üstüne ekleyin.
  3. Ardından, hemen altına aşağıdaki kodu ekleyerek arama işlevini çağırın:
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}

Bu kod snippet'i, semanticSearch yönteminizi eşzamansız olarak çağırır. 800 milisaniyelik bir zaman aşımı sağlayarak görev değiştiriciye kullanıcının girişini 0, 8 saniye boyunca sekmeyi kaldırması talimatını verirsiniz. Bu, semanticSearch işlevinin yalnızca kullanıcı 0,8 saniyeden uzun bir süre boyunca yazmayı duraklattığında çağrılacağı anlamına gelir.

Kodunuz artık şu şekilde görünmelidir:

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

Uygulamayı çalıştırma

  1. Uygulamayı iOS simülasyon aracında başlatmak için ⌘ + R tuşlarına basın (veya Çalıştır düğmesini tıklayın).
  2. Bu codelab'in önceki bölümlerinde uygulamaya eklediğiniz notların yanı sıra Firebase konsolu üzerinden eklediğiniz notları da görmeniz gerekir.
  3. Notlar listesinin en üstünde bir arama alanı görürsünüz.
  4. Eklediğiniz dokümanlardan birinde geçen bir terim yazın. Bu özellik, "Swift'ten eşzamansız Firebase API'lerini nasıl çağırabilirim?" gibi anlamsal sorgular için en iyi sonucu verir (eklediğiniz notlardan en az birinde bu konuyu ele alan bir metin olması gerekir).
  5. Arama sonucunu görmeyi beklerken liste görünümü boş kalıyor ve Xcode konsolunda "The function was called with an invalid argument" (İşlev, geçersiz bir bağımsız değişkenle çağrıldı) hata mesajı gösteriliyor.

Boş sonuç listesi içeren Notlar uygulaması

Bu, verileri yanlış biçimde gönderdiğiniz anlamına gelir.

Hata mesajını analiz etme

  1. Ne gibi bir sorun olduğunu öğrenmek için Firebase konsoluna gidin.
  2. İşlevler bölümüne gidin.
  3. ext-firestore-vector-search-queryCallable işlevini bulun, üç dikey noktayı tıklayarak taşma menüsünü açın.
  4. Günlük Gezgini'ne gitmek için Günlükleri görüntüle'yi seçin.
  5. Bir hata mesajı görürsünüz.
Unhandled error ZodError: [
  {
    "code": "invalid_type",
    "expected": "object",
    "received": "string",
    "path": [],
    "message": "Expected object, received string"
  }
]

Bu, verileri yanlış biçimde gönderdiğiniz anlamına gelir.

Doğru veri türlerini kullanma

Uzantının parametrelerin hangi biçimde olmasını beklediğini öğrenmek için uzantının belgelerine göz atın.

  1. Firebase konsolunda Uzantılar bölümüne gidin.
  2. Yönet ->Vector Search with Firestore uzantısını yönetme seçeneğini tıklayın.
  3. Bu uzantının çalışma şekli bölümünde, giriş ve çıkış parametrelerinin spesifikasyonunu bulabilirsiniz.Giriş parametresinin ve sonuç değerinin dokümanı
  4. Xcode'a geri dönün ve NotesRepository.swift bölümüne gidin.
  5. Dosyanın başına aşağıdaki kodu ekleyin:
    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, uzantının dokümanlarına göre, uzantının beklediği giriş parametresinin yapısıyla eşleşiyor. Ayrıca, daha sonra ihtiyacınız olacak iç içe yerleştirilmiş bir prefilter özelliği de içerir.QueryResponse, uzantının yanıtının yapısıyla eşleşir.
  6. Çağrılabilir işlev spesifikasyonunu bulun ve giriş ile çıkış türlerini güncelleyin.
    private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    
  7. performQuery içinde çağrılabilir işlevin çağrılmasını güncelleme
    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 []
      }
    }
    

Uygulamayı tekrar çalıştırın.

  1. Uygulamayı tekrar çalıştırın.
  2. Notlarınızdan birinde yer alan terimleri içeren bir arama sorgusu yazın.
  3. Artık filtrelenmiş not listesini görmelisiniz.

Beklenen sonucu gösteren uygulamanın ekran görüntüsü

Kullanıcı verilerini önceden filtreleme

Sevinçten dans etmeden önce uygulamanın mevcut sürümüyle ilgili bir sorun olduğunu belirtmek isteriz: Sonuç kümesi, tüm kullanıcıların verilerini içeriyor.

Bunu, uygulamayı farklı bir simülatörde çalıştırıp daha fazla doküman ekleyerek doğrulayabilirsiniz. Yeni dokümanlar yalnızca bu simülatörde gösterilir. Uygulamayı diğer simülatörde tekrar çalıştırırsanız yalnızca ilk seferde oluşturduğunuz dokümanları görürsünüz.

Arama yaptığınızda vectorSearchQueryCallable işlevine yapılan çağrının, diğer kullanıcıya ait olabilecek doküman kimliklerini döndürdüğünü görürsünüz. Bunu önlemek için ön filtre kullanmamız gerekir.

performQuery içinde kodunuzu aşağıdaki şekilde güncelleyin:

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

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

Bu işlem, verileri oturum açmış kullanıcının kimliğine göre önceden filtreler. Bekleyebileceğiniz gibi, bu işlem için Firestore dizininin güncellenmesi gerekir.

userId ve embedding alanındaki vektör yerleştirmelerini içeren yeni bir Firestore dizini tanımlamak için komut satırından aşağıdaki komutu çalıştırın.

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

Dizin oluşturma işlemi tamamlandıktan sonra, beklendiği gibi çalıştığını doğrulamak için uygulamayı tekrar çalıştırın.

Önceden filtrelenmiş sonuç grubu

8. Tebrikler

Tebrikler! Bu codelab'i başarıyla tamamladınız.

Bu codelab'de şunları öğrendiniz:

  • Semantik arama etkinleştirilmiş bir Cloud Firestore veritabanı oluşturun.
  • Veritabanıyla etkileşim kurmak için basit bir SwiftUI uygulaması oluşturun.
  • SwiftUI'ın searchable görünüm değiştiricisini ve task değiştiricisini kullanarak bir arama çubuğu uygulayın.
  • Firestore SDK'nın Callable arayüzünü kullanarak veritabanında anlamsal arama yapmak için Cloud Functions işlevi çağırın.

Bu codelab'de edindiğiniz bilgilerle artık Cloud Firestore'un semantik arama özelliklerinden yararlanarak kullanıcılarına daha sezgisel ve verimli bir arama deneyimi sunan güçlü uygulamalar oluşturabilirsiniz.

Firestore'un yeni vektör alanı ve vektör yerleştirmelerinin nasıl hesaplanacağı hakkında daha fazla bilgi edinmek için belgelere göz atın.