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

1. Genel Bakış

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

Sağ taraftaki iOS uygulamasında da görünen bazı dokümanları gösteren Cloud Firestore konsolu.

Öğrenecekleriniz

  • Vektör yerleştirmelerini hesaplamak için Firestore uzantılı Vector Search'i yükleme.
  • Swift uygulamasından Firebase Cloud Functions'ı çağırma.
  • Oturum açmış kullanıcıya göre verileri ön filtreleme.

İhtiyacınız olanlar

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

2. Firebase projesi oluşturup ayarlama

Firebase Vektör Arama uzantısını kullanmak için bir Firebase projeniz olmalıdır. 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. Firebase'de oturum açın.
  2. Firebase konsolunda Proje ekle'yi tıklayın, ardından projenizi Firestore Vektör Arama Laboratuvarı olarak adlandırınProje oluşturma, adım 1/3: Proje adını seçme
  3. Proje oluşturma seçeneklerini tıklayın. İstenirse Firebase şartlarını kabul edin.
  4. Bu uygulama için Analytics'i kullanmayacağınız için Google Analytics ekranında Bu proje için Google Analytics'i etkinleştir kutusunun işaretini kaldırın.
  5. Son olarak Proje oluştur'u 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'i ve temel bulut hizmetlerini kullanmak için Firebase projenizin kullan-öde (Blaze) fiyatlandırma planında olması gerekir. Yani projeniz bir Cloud Faturalandırma hesabına bağlı olmalıdır.

  • Cloud Billing hesabı için kredi kartı gibi bir ödeme yöntemi gerekir.
  • Firebase ve Google Cloud'da yeniyseniz 300 ABD doları kredi ve Ücretsiz Deneme Cloud Faturalandırma hesabı almaya uygun olup olmadığınızı kontrol edin.
  • Bu kod laboratuvarını bir etkinlik kapsamında yapıyorsanız düzenleyen kişiye Cloud kredisi olup olmadığını sorun.

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

  1. Firebase konsolunda planınızı yükseltmeyi seçin.
  2. Blaze planını seçin. Projenize bir Cloud Faturalandırma hesabı 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ır:

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

Bu ürünlerin bazıları için özel yapılandırma veya Firebase Konsolu'nun kullanılması gerekir.

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ğrulamasını kullanır. Bu sayede, ilk katılım süreci sorunsuz bir şekilde gerçekleşir. Anonim kimlik doğrulama (ve adlandırılmış hesaba geçme) 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 panelinde Derleme > Kimlik doğrulama'yı tıklayın. Ardından Başlayın'ı tıklayın.Firebase Authentication'i etkinleştirme
  2. Şimdi, 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 Anonymous'i (Anonymous) tıklayın, anahtarı Enable'a (Etkinleştir) getirin ve ardından Save'i (Kaydet) tıklayın.

Cloud Firestore'u ayarlama

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

Cloud Firestore'u Firebase projenizde ayarlamak için:

  1. Firebase konsolunun sol panelinde Derleme'yi genişletin ve ardından Firestore veritabanı'nı seçin.
  2. Create database'i (Veritabanı oluştur) tıklayın.
  3. Veritabanı Kimliği'ni (default) olarak bırakın.
  4. Veritabanı 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 kod laboratuvarının ilerleyen bölümlerinde, verilerinizin güvenliğini sağlamak için güvenlik kuralları ekleyeceksiniz. Veritabanınıza Güvenlik Kuralları eklemeden bir uygulamayı dağıtmayın veya herkese açık olarak göstermeyin.
  6. Oluştur'u tıklayın.

Cloud Storage for Firebase'i kurma

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

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

  1. Firebase konsolunun sol panelinde Derleme'yi genişletin ve ardından Depolama'yı seçin.
  2. Başlayın'ı tıklayın.
  3. Varsayılan Storage paketiniz için bir konum seçin.
    US-WEST1, US-CENTRAL1 ve US-EAST1'deki paketler, Google Cloud Storage'ın "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 kod laboratuvarının ilerleyen bölümlerinde, verilerinizin güvenliğini sağlamak için güvenlik kuralları ekleyeceksiniz. Depolama alanı paketiniz için Güvenlik Kuralları eklemedenbir uygulamayı dağıtmayın veya herkese açık olarak göstermeyin.
  5. Oluştur'u tıklayın.

3. Mobil uygulamayı bağlama

Bu kod alanının bu bölümünde, basit bir not alma uygulamasının kaynak kodunu indirip 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 Firebase konsolunda uygulamayı 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. Firebase'i Apple uygulamanıza ekleyin ekranında, Xcode projesindeki paket kimliğini (com.google.firebase.codelab.Notes) ekleyin.
  4. Dilerseniz uygulamaya takma ad girebilirsiniz (iOS için Notlar).
  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 Notlar 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 bölümünde Notlar hedefinin seçildiğinden emin olun ve Son'u tıklayın.Dosya ekleme seçeneklerini belirleme iletişim kutusunda "Gerekirse kopyala"yı seçmek
  9. Firebase konsolunda, kurulum işleminin geri kalanını tıklayabilirsiniz: Bu bölümün başında indirdiğiniz örnekte Firebase Apple SDK'sı zaten yüklü ve ilklendirme ayarlanmıştır. Konsol'a devam'ı tıklayarak işlemi tamamlayabilirsiniz.

Uygulamayı çalıştırma

Artık uygulamayı deneme zamanı geldi.

  1. Xcode'a geri dönüp uygulamayı iOS simülatöründe çalıştırın. Çalıştırma Hedefleri açılır listesinde önce iOS simülasyon araçlarından birini seçin.Çalıştırma Hedefleri açılır menüsünde 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. Uygulamaya yeni notlar eklerken oluşturulan yeni dokümanları görmek için Firebase konsolunda Firestore veri tarayıcısına gidin.Aynı dokümanları gösteren iOS simülatörünün yanı sıra bazı dokümanları gösteren Cloud Firestore konsolu

4. Firestore ile Vector Search uzantısını yükleme

Codelab'in bu bölümünde, Firestore uzantılı Vector Search'i yükleyip üzerinde çalıştığınız not alma uygulamasının gereksinimlerine göre yapılandıracaksınız.

Uzantıyı yükleme işlemini 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şfet'i tıklayın.Firestore konsolundaki Firebase Extensions sekmesi
  3. "vector" yazın.
  4. "Firestore uzantılı vektör arama"yı tıklayın.Firebase Extensions Hub açılış sayfası Bu işlem, uzantı hakkında daha fazla bilgi edinebileceğiniz uzantı ayrıntıları sayfasına yönlendirir. Uzantının işleyiş şekli, hangi Firebase hizmetlerini gerektirdiği ve nasıl yapılandırabileceğiniz bu sayfada açıklanmıştır.
  5. Firebase konsoluna yükle'yi tıklayın.Firestore ile Vektör Arama uzantısının yükleme düğmesi
  6. Tüm projelerinizin listesi gösterilir.
  7. Bu kod laboratuvarının 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 verilen erişimi inceleyin.
  5. Uzantıyı yapılandırın:
    • LLM olarak Vertex AI'ı seçin
    • Koleksiyon 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'in 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ğitimimizin bir sonraki bölümüne geçip vektör gömmeleriyle ilgili bazı temel bilgileri okuyabilirsiniz.

5. Arka plan

Kurulumun tamamlanmasını beklerken Firestore uzantılı vektör aramanın işleyiş şekli hakkında bazı temel bilgiler edinebilirsiniz.

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 göstermek için kullanılabilirler.
  • Yerleşimler, bir kelimenin veya kelime öbeğinin anlamını temsil eden vektörlerdir. Bu modeller, büyük bir metin veri kümesinde eğitilen bir nöral ağ kullanılarak ve kelimeler arasındaki ilişkiler öğrenilerek oluşturulur.
  • Vektör veritabanları, vektör verilerini depolamak ve aramak için optimize edilmiş veritabanlarıdır. Belirli bir sorgu vektörüne en benzer vektörleri bulma işlemi olan verimli en yakın komşu araması yapılması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. Firestore uzantısıyla Vector Search'i deneme

Bu codelab'de daha önce indirdiğiniz iOS uygulamasında Firestore uzantılı vektör arama özelliğini kullanmadan önce uzantıyı Firebase konsolunda deneyebilirsiniz.

Belgeleri okuyun

Firebase Extensions'in işleyiş şekliyle ilgili dokümanlar mevcuttur.

  1. Uzantı yüklendikten sonra Başlayın düğmesini tıklayın. Firebase konsolundaki Firebase uzantısına genel bakış sayfası
  2. "Bu uzantının çalışma şekli" sekmesine göz atın. Bu sekmede şunlar açıklanmaktadır:
    • Dokümanları notes koleksiyonuna ekleyerek dokümanlar için iç içe yerleştirmeleri hesaplama,
    • ext-firestore-vector-search-queryCallable çağrılabilir işlevini çağırarak dizini sorgulama,
    • veya _firestore-vector-search/index/queries koleksiyonuna sorgu belgesi ekleyerek dizini nasıl sorgulayacağınızı öğrenebilirsiniz.
    • Ayrıca, özel bir yerleştirme işlevinin nasıl ayarlanacağı da açıklanmaktadır. Bu, uzantı tarafından desteklenen LLM'lerden hiçbiri gereksinimlerinizi karşılamıyorsa ve yerleştirmeleri hesaplamak için farklı bir LLM kullanmak istiyorsanız yararlıdır. Firestore uzantılı vektör araması 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. Bu kod laboratuvarının önceki bir adımında oluşturduğunuz tüm not dokümanlarının yerleştirilmesini tamamladığını gösterir.Firestore konsolundaki dizin yapılandırması
  5. Bunu doğrulamak için not belgelerinden birini açın. vector<768> türüne sahip embedding adlı ek bir alanın yanı sıra bir status alanı görürsünüz.Firestore konsolundaki bir vektör yerleştirme alanı

Örnek doküman oluşturma

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

  1. Firestore veri tarayıcısında notes koleksiyonuna gidin ve orta sütunda + Doküman 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ı, dize türüne sahip bir alan ekleyin ve değer alanına 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ı, veri 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 embedding alanı görürsünüz.
    Yeni doküman için vektör yerleştirme durumu güncellemesi

Sorgu yapma

Firestore uzantılı Vektör Arama, uygulama bağlamanıza gerek kalmadan doküman dizinindeki verileri sorgulamanıza olanak tanıyan kullanışlı bir özelliğe sahiptir.

  1. Firebase konsolunun Firestore bölümünde _firestore-vector-search/index belgesine gidin
  2. + Koleksiyon başlat'ı tıklayınYeni 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 bulunan bir metne ayarlayın. Bu yöntem, "Firestore belgelerini Swift ile nasıl eşleyebilirim?" gibi anlamsal sorgular için en iyi sonucu verir (Eklediğiniz notlardan en az biri bu konuyu ele alan metin içeriyorsa).Sorgu alanı ekleme
  5. Durumda bir hata görebilirsinizBir hata oluştu
  6. Bu durum, eksik bir dizinden kaynaklanmaktadır. Eksik dizin yapılandırmasını ayarlamak için bu bağlantıyı takip ederek projenizin Google Cloud Console'una gidin ve listeden projenizi seçinDoğru projeyi seçme
  7. Cloud Günlük Gezgini'nde "FAILED_PRECONDITION: Vektör dizini yapılandırması eksik" yazan bir hata mesajı görürsünüz. Lütfen aşağıdaki gcloud komutuyla gerekli dizini oluşturun: ..."Günlük gezgininde 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ızdan 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 Dizine Eklemeler sekmesinde kontrol edebilirsiniz.Yeni dizinin durumu
  10. Dizin oluşturulduktan sonra yeni bir sorgu dokümanı oluşturabilirsiniz.
  11. Artık sonuçlar alanında eşleşen doküman kimliklerinin listesini göreceksinizSemantik sorgu gerçekleştirme sonucu
  12. Bu kimliklerden birini kopyalayıp 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. Anlamsal aramayı uygulama

Artık mobil uygulamanızı Firestore uzantılı Vektör Arama'ya bağlamanın ve kullanıcılarınızın doğal dil sorgularını kullanarak notlarında arama yapmalarına olanak tanıyacak bir anlamsal arama özelliği uygulamanın zamanı geldi.

Sorgu yürütmek için çağrılabilir işlevi bağlama

Firestore ile Vektör Arama uzantısı, bu kod laboratuvarının önceki aşamalarında oluşturduğunuz dizini sorgulamak için mobil uygulamanızdan çağırabileceğiniz bir Cloud Functions içerir. Bu adımda, mobil uygulamanız ile bu çağrılabilir işlev arasında bir bağlantı kuracaksınız. Firebase'ın Swift SDK'sı, uzak işlevleri sorunsuz bir şekilde çağıran API'ler içerir.

  1. Xcode'a geri dönün ve bu kod laboratuvarının ö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 Derleme bölümündeki İş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ı dosyayı arayın ve adını kopyalayın.
  4. Adı kodunuza yapıştırın. Artık şunu göreceksiniz:
    private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    

Sorgu işlevini çağırma

  1. performQuery yöntemini bulun
  2. Aşağıdakileri çağırarak çağrılabilir işlevinizi çağırın:
    let result = try await vectorSearchQueryCallable(searchTerm)
    

Bu uzak bir çağrı olduğundan başarısız olabilir.

  1. Hataları yakalamak ve Xcode'un konsoluna kaydetmek için bazı temel hata işleme işlemleri 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ı aramasına izin vermek için not listesi ekranına bir arama çubuğu ekleyeceksiniz. Kullanıcı bir arama terimi girdiğinde, önceki adımda uyguladığınız performQuery yöntemini çağırmanız gerekir. SwiftUI tarafından sağlanan searchable ve task görünüm değiştiricileri 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, aşağıdaki kodu ekleyip 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 debounce etmesini talimat verirsiniz. Bu, semanticSearch işlevinin yalnızca kullanıcı yazma işlemini 0,8 saniyeden uzun süre duraklattığında çağrılacağı anlamına gelir.

Kodunuz şu şekilde görünecektir:

...
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 kod laboratuvarının önceki aşamalarında uygulamaya eklediğiniz notların yanı sıra Firebase konsolu üzerinden eklediğiniz notları da görürsünüz.
  3. Notlar listesinin en üstünde bir arama alanı görürsünüz.
  4. Eklediğiniz dokümanlardan birinde görünen bir terim yazın. Bu yöntem, "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 birinin bu konuyu ele alan metin içermesi gerekir).
  5. Arama sonucunu görmeyi bekleyebilirsiniz ancak bunun yerine liste görünümü boştur ve Xcode konsolunda "İşlev geçersiz bir bağımsız değişkenle çağrıldı" hata mesajı gösterilir.

Boş bir sonuç listesi içeren Notlar uygulaması

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

Hata mesajını analiz etme

  1. Sorunun ne 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 gezginine gitmek için Günlükleri görüntüle'yi seçin.
  5. Bir hata 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 konsolundaki Uzantılar bölümüne gidin.
  2. Yönet ->Firestore uzantısıyla Vector Search&#39;i yönetme seçeneğini tıklayın.
  3. Bu uzantının çalışma şekli bölümünde, giriş ve çıkış parametrelerinin bir tanımını bulabilirsiniz.Giriş parametresi ve sonuç değeriyle ilgili dokümanlar
  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 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'te çağrılabilir işlevin çağrılmasını güncelleyin
    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ırma

  1. Uygulamayı tekrar çalıştırma
  2. Notlarınızdan birine dahil edilen terimleri içeren bir arama sorgusu yazın
  3. Filtrelenmiş not listesini göreceksiniz.

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

Kullanıcı verilerini önceden filtreleme

Kutlama için dansa başlamadan önce, uygulamanın mevcut sürümünde bir sorun olduğunu belirtmek isteriz: Sonuç kümesi tüm kullanıcıların verilerini içeriyor.

Uygulamayı farklı bir simülatörde çalıştırıp daha fazla doküman ekleyerek bunu 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 kez oluşturduğunuz dokümanları görürsünüz.

Arama yaparsanız vectorSearchQueryCallable çağrısının diğer kullanıcıya ait olabilecek doküman kimliklerini döndürdüğünü fark edersiniz. Bunu önlemek için bir ö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 giriş yapan kullanıcının kimliğine göre ön filtreler. Tahmin edebileceğiniz gibi, bunun için Firestore dizininin güncellenmesi gerekir.

Hem userId alanını hem de embedding alanındaki vektör yerleşimlerini 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şturulduktan sonra, beklendiği gibi çalıştığını doğrulamak için uygulamayı tekrar çalıştırın.

Önceden filtrelenmiş sonuç kümesi

8. Tebrikler

Bu codelab'i başarıyla tamamladığınız için tebrikler.

Bu kod laboratuvarında şunları öğrendiniz:

  • Anlamsal aramanın etkin olduğu bir Cloud Firestore veritabanı oluşturun.
  • Veritabanı ile etkileşimde bulunmak için basit bir SwiftUI uygulaması oluşturun.
  • SwiftUI'nin aranabilir görünüm değiştiricisini ve görev değiştiricisini kullanarak bir arama çubuğu uygulayın.
  • Firestore SDK'sının Callable arayüzünü kullanarak veritabanında semantik arama yapmak için bir Cloud Functions işlevi çağırın.

Bu codelab'de edindiğiniz bilgilerle artık kullanıcılara daha sezgisel ve verimli bir arama deneyimi sunmak için Cloud Firestore'un anlamsal arama özelliklerinden yararlanan 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 dokümanlara göz atın.