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 anlamsal arama özelliği uygulayacaksınız.

Sağ taraftaki iOS uygulamasında da görülebilen bazı belgeleri gösteren Cloud Firestore konsolu.

Öğrenecekleriniz

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

Gerekenler

  • Xcode 15.3
  • Codelab örnek kodu. Bu kodu, 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 projesine ihtiyacınız vardır. Codelab'in bu bölümünde yeni bir Firebase projesi oluşturup Cloud Firestore ve Firebase Authentication gibi gerekli hizmetleri etkinleştireceksiniz.

Firebase projesi oluşturun

  1. Firebase'de oturum açın
  2. Firebase konsolunda Proje ekle'yi tıklayın, ardından projenizi Firestore Vector Search Lab olarak adlandırınProje oluşturun, 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 kullanmayacağınızdan Google Analytics ekranında Bu proje için Google Analytics'i etkinleştir kutusunun işaretini kaldırın.
  5. Son olarak Create project (Proje oluştur) seçeneğini tıklayın.

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

Konsolda Firebase ürünlerini etkinleştirme ve ayarlama

Oluşturduğunuz uygulama, Apple uygulamalarında kullanılabilen çeşitli Firebase ürünleri kullanıyor:

  • Kullanıcılarınızın uygulamanızda oturum açmasına kolayca izin vermek için Firebase Authentication.
  • Yapılandırılmış verileri buluta 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ı.

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

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

Bu uygulama, kullanıcıların hesap oluşturmak zorunda kalmadan uygulamayı kullanmaya başlayabilmesi için anonim kimlik doğrulama teknolojisinden yararlanır. Bu, ilk katılım sürecinin sorunsuz olmasını sağlar. Anonim kimlik doğrulama (ve adlandırılmış bir hesaba yükseltme) hakkında daha fazla bilgi edinmek için Anonim kimlik doğrulama için En İyi 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 Autentication'ı etkinleştirme
  2. Kaydolan kullanıcıları görebileceğiniz, oturum açan sağlayıcıları 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'e getirin ve Kaydet'i tıklayın.

Cloud Firestore kurulumu

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

  1. Firebase konsolunun sol tarafındaki panelde Derle > Firestore Veritabanı'nı tıklayın. Ardından, Create database'i (Veritabanı oluştur) tıklayın.Cloud Firestore'u etkinleştirme
  2. Veritabanınızın konumunu seçerek Gemini'nin kullanıma sunulduğu bir konum seçtiğinizden emin olun (us-central1 bölgesini kullanabilirsiniz). Bununla birlikte, bu konumun daha sonra değiştirilemeyeceğini unutmayın. İleri'yi tıklayın.
  3. Test modunda başlat seçeneğini belirleyin. Güvenlik kurallarıyla ilgili sorumluluk reddi beyanını okuyun. Test modu, geliştirme sırasında veritabanına serbestçe yazabilmenizi sağlar.Test modunda Firestore için Güvenlik Kuralları ayarlama
  4. Veritabanını oluşturmak için Oluştur'u tıklayın.

3. Mobil uygulamayı bağlayın

Codelab'in 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 depoyu 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şturuyorsanı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 (com.google.firebase.codelab.Notes) paket kimliğini ekleyin.
  4. İsterseniz bir uygulama 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 Notes klasörüne sürükleyin. Bunu yapmanın en iyi yolu, öğeyi 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çili olduğundan emin olun ve Son'u tıklayın.Dosya ekleme iletişim kutusunda "Gerekirse kopyala" seçeneğini belirleme
  9. Artık Firebase konsolunda kurulum işleminin kalanını tıklayabilirsiniz: Bu bölümün başında indirdiğiniz örnekte zaten Firebase Apple SDK yüklü ve ilk kullanıma hazır hale getirilmiş durumda. Konsola devam et'i tıklayarak işlemi tamamlayabilirsiniz.

Uygulamayı çalıştırma

Şimdi uygulamayı deneme zamanı!

  1. Tekrar Xcode'a dönün ve iOS Simülatörü'nde uygulamayı çalıştırın. Hedefleri Çalıştır açılır menüsünde, önce iOS Simülatörlerinden birini seçin.Çalıştırma Hedefleri açılır menüsünden 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örde başarıyla kullanıma sunulduktan sonra birkaç not ekleyin.
  4. Firebase konsolunda Firestore veri tarayıcısına gidin. Böylece, uygulamaya yeni notlar eklerken oluşturulan yeni dokümanları görebilirsiniz.Bazı belgeleri ve aynı belgeleri gösteren iOS Simülatörü'nü gösteren Cloud Firestore konsolu

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

Codelab'in bu bölümünde, Firestore ile Vector Search 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üklemeye başlayın

  1. Yine Firestore bölümünde Uzantılar sekmesini tıklayın.Firestore konsolunda Firebase Extensions sekmesini seçme
  2. Uzantılar Merkezi'ni keşfedin'i tıklayın.Firestore konsolundaki Firebase Extensions sekmesi
  3. "Vektör" yazın.
  4. "Firestore uzantısıyla vektör arama"yı tıklayın.Firebase Extensios Hub açılış sayfası Bu sizi uzantının ayrıntılar sayfasına yönlendirir. Burada, uzantı, nasıl çalıştığı, hangi Firebase hizmetleri için gerekli olduğu ve uzantıyı nasıl yapılandırabileceğiniz hakkında daha fazla bilgi edinebilirsiniz.
  5. Firebase konsolunda yükle'yi tıklayın.Firestore ile Vector Search uzantısı için yükle düğmesi
  6. Tüm projelerinizin bir listesi size sunulur.
  7. Bu codelab'in ilk adımında oluşturduğunuz projeyi seçin.Firebase proje seçici ekranı

Uzantıyı yapılandırma

Firebase Extensions, projenizin kullandıkça öde Blaze planına dahil olmasını gerektiren Cloud Functions for Firebase'den yararlanır. Vector Search'ü Firestore uzantısını kullanarak kullanabilmek için projenizi yükseltmeniz gerekir.

  1. Devam etmek için Projeyi yükselt'i tıklayın. Projeyi Blaze planına yükseltme
  2. Mevcut bir faturalandırma hesabını seçin veya yeni bir hesap oluşturun. Devam'ı tıklayın.Faturalandırma hesabı seçme
  3. Bütçe belirleyin (ör. 10 TRY), Devam'ı ve ardından Satın al'ı tıklayın.Bütçe oluşturma
  4. Etkinleştirilen API'leri ve oluşturulan kaynakları inceleyin.Etkin API'leri inceleme
  5. Gerekli hizmetleri etkinleştirin.Gerekli hizmetleri etkinleştirme
  6. Cloud Storage'ı etkinleştirirken güvenlik kuralları için test modunu seçin.
  7. Cloud Storage'ın Cloud Firestore örneğinizle aynı konumu kullanacağını onaylayın.
  8. Tüm hizmetler etkinleştirildikten sonra İleri'yi tıklayın.Tüm hizmetleri etkinleştirdikten sonra İleri'yi tıklayın
  9. Bu uzantıya inceleme erişimi verildi.
  10. 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ı: metin
    • Çıkış alanı adı: embedding
    • Durum alanı adı:* *durum*
    • Mevcut dokümanları yerleştir: Evet
    • Mevcut dokümanları güncelle: Evet
    • Cloud Functions konumu: us-central1
  11. Yüklemeyi tamamlamak için Uzantıyı yükle'yi tıklayın.

Bu işlem birkaç dakika sürebilir. Yükleme işleminin tamamlanmasını beklerken eğiticinin bir sonraki bölümüne geçebilir ve vektör yerleştirmeleri hakkında bazı arka plan bilgilerini okuyabilirsiniz.

5. Genel bilgi

Yüklemenin tamamlanmasını beklerken, Firestore ile Vector Search uzantısının nasıl çalıştığıyla ilgili bazı arka plan bilgilerini 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 sunmak için kullanılabilirler.
  • Gömmeler, bir kelimenin veya ifadenin anlamını temsil eden vektörlerdir. Bu araçlar, büyük bir metin bir nöral ağının eğitilmesi ve kelimeler arasındaki ilişkilerin öğrenilmesiyle oluşturulur.
  • Vektör veritabanları, vektör verilerini saklamak ve aramak için optimize edilmiş veritabanlarıdır. Belirli bir sorgu vektörüne en çok benzeyen vektörleri bulma işlemi olan, en yakın komşu aramasının verimli bir şekilde yapılmasını sağlarlar.

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

Vektör araması, sorgu vektörü veritabanındaki tüm vektörlerle karşılaştırılarak çalışır. Sorgu vektörüne en çok benzeyen vektörler, arama sonucu 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 ile Vektör Arama uzantısını deneyin

Bu codelab'de daha önce indirdiğiniz iOS uygulamasında Firestore ile Vektör Arama uzantısını kullanmadan önce uzantıyı Firebase konsolunda deneyebilirsiniz.

Belgeleri okuyun

Firebase Extensions, çalışmalarıyla ilgili belgeler içerir.

  1. Uzantının yüklenmesi tamamlandıktan 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. Açıklamada şunlar açıklanmaktadır:
    • dokümanlar için yerleştirilmiş öğeleri notes koleksiyonuna ekleyerek nasıl hesaplayacağınızı,
    • ext-firestore-vector-search-queryCallable çağrılabilir işlevini çağırarak dizinin nasıl sorgulanacağına,
    • veya _firestore-vector-search/index/queries koleksiyonuna sorgu belgesi ekleyerek dizini sorgulama.
    • Makalede, özel yerleştirme işlevinin nasıl ayarlanacağı da açıklanmıştır. Uzantının desteklediği LLM'lerden hiçbiri gereksinimlerinizi karşılamıyorsa ve yerleştirmeleri hesaplamak için farklı bir LLM kullanmak istiyorsanız bu yöntem yararlıdır.Firestore ile Vector Search uzantısıyla ilgili 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 bir adımında oluşturduğunuz tüm not dokümanlarının yerleştirmelerini tamamladığını gösterir.Firestore konsolundaki dizin yapılandırması
  5. Bunu doğrulamak için notlar dokümanlarından birini açın. vector<768> türünde embedding adlı ek bir alan ve bir status alanı göreceksiniz.Firestore konsolunun içindeki 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ütundaki + Belge ekle'yi tıklayın.Yeni doküman ekleme
  2. Yeni bir benzersiz doküman kimliği oluşturmak için Auto-ID'yi (Otomatik Kimlik) tıklayın.
  3. Dize türünde text adlı bir alan ekleyin ve değer alanına metin yapıştırın. Bunun lorem ipsum veya rastgele başka bir 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 vector<768> değerinde yeni bir embedding alanı göreceksiniz.
    Yeni doküman için vektör yerleştirmeleri durum güncellemesi

Sorgu gerçekleştirme

Firestore ile Vector Search uzantısı, herhangi bir uygulama bağlamanıza gerek kalmadan doküman dizinini sorgulamanızı sağlayan küçük ve şık bir özelliğe sahiptir.

  1. Firebase konsolunun Firestore bölümünde _firestore-vector-search/index belgesine gidin
  2. + Koleksiyonu başlat'ı tıklayınYeni bir alt koleksiyon ekleme
  3. queries adlı yeni bir alt koleksiyon oluştur
  4. Yeni bir doküman oluşturun ve query alanını dokümanlarınızdan birinde görünen bir metne ayarlayın. Bu, en çok, "Firestore dokümanlarını Swift ile nasıl eşleyebilirim?" gibi semantik sorgularda işe yarar (eklediğiniz notlardan en az birinin bu konuyu açıklayan bir metin içermesi şartıyla).Sorgu alanı ekleme
  5. Şu durumda bir hata görebilirsiniz:Bir hata oluştu
  6. Bunun nedeni, eksik bir dizindir. Eksik dizin yapılandırmasını ayarlamak için bu bağlantıyı izleyip listeden projenizi seçerek projenizin Google Cloud konsoluna gidinDoğru projeyi seçme
  7. Cloud Log Explorer'da, artık "FAILED_PRECONDITION: Vektör dizini yapılandırması eksik. Lütfen aşağıdaki gcloud komutuyla gerekli dizini oluşturun: ..."Günlük gezgininde hata mesajı
  8. Hata mesajı, eksik dizini yapılandırmak için çalıştırmanız gereken bir gcloud komutu da içerir.
  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 Dizinler sekmesinden kontrol edebilirsiniz.Yeni dizinin durumu
  10. Dizin ayarlandıktan sonra yeni bir sorgu dokümanı oluşturabilirsiniz.
  11. Artık sonuçlar alanında eşleşen doküman kimliklerinin listesini göreceksinizAnlamsal sorgu gerçekleştirmenin sonucu
  12. Bu kimliklerden birini kopyalayıp notes koleksiyonuna geri dönün.
  13. Kopyaladığınız doküman kimliğini aramak için ⌘+F tuşlarını kullanın. Sorgunuzla en iyi eşleşen doküman, bu dokümandır.Doküman listesinde doküman kimliğini bulma

7. Anlamsal aramayı uygulayın

Artık mobil uygulamanızı Firestore uzantısıyla Vector Search'e bağlayıp kullanıcılarınızın notlarında doğal dil sorguları kullanarak arama yapmasına olanak sağlayacak bir anlamsal arama özelliği uygulamanın zamanı geldi.

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

Firestore ile Vector Search uzantısı, bu codelab'de daha önce oluşturduğunuz dizini sorgulamak için mobil uygulamanızdan çağırabileceğiniz bir Cloud Functions işlevi içerir. Bu adımda, mobil uygulamanız ile bu çağrılabilir işlev arasında bir bağlantı kuracaksınız. Firebase'in Swift SDK'sı, uzak işlevlerin çağrılmasını sorunsuz hale getiren API'ler içerir.

  1. Xcode'a geri dönün ve bu codelab'in önceki 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("") değerini içeren satırı bul

Çağrılabilir bir Cloud Functions işlevini çağırmak için çağırmak istediğiniz işlevin adını belirtmeniz 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ı olanı arayın ve adını kopyalayın.
  4. Adı kodunuza yapıştırın. Şimdi şu şekilde olmalı:
    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. let result = try await vectorSearchQueryCallable(searchTerm)
    
    çağrısı yaparak çağrılabilir işlevinizi çağırın

Bu uzaktan yapılan bir arama olduğundan başarısız olabilir.

  1. Hataları yakalamak ve Xcode konsoluna kaydetmek için temel hata giderme adımları 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ında arama yapmasına izin vermek için, notlar listesi ekranında bir arama çubuğu uygulayacaksınız. Kullanıcı bir arama terimi yazdığında, ö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 sadece birkaç satır kod gerektirir.

  1. İlk olarak NotesListScreen.swift uygulamasını açın
  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 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 alçak geri döndürmesi talimatını verirsiniz. Bu durumda semanticSearch, yalnızca kullanıcı 0,8 saniyeden uzun bir süre yazmayı duraklattığında çağrılır.

Kodunuz aşağıdaki gibi 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ülatör'de başlatmak için ⌘ + R tuşlarına basın (veya Çalıştır düğmesini tıklayın)
  2. Bu codelab'de daha önce uygulamaya eklediğiniz notların yanı sıra Firebase konsolu aracılığıyla eklediğiniz notları görürsünüz
  3. Notlar listesinin en üstünde bir arama alanı göreceksiniz.
  4. Eklediğiniz dokümanlardan birinde görünen bir terimi yazın. Yine bu yöntem, "Swift'ten eşzamansız Firebase API'lerini nasıl çağırabilirim?" gibi anlamsal sorgularda daha iyi sonuç verir (eklediğiniz notlardan en az birinin bu konuyu açıklayan bir metin içermesi şartıyla).
  5. Muhtemelen arama sonucunu görmeyi bekliyorsunuz ancak bunun yerine liste görünümü boştur ve Xcode konsolu şu hata mesajını gösterir: "İşlev geçersiz bir bağımsız değişkenle çağrıldı"

Boş bir sonuç listesiyle birlikte Notlar uygulaması

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

Hata mesajını analiz edin

  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öster'i seçin
  5. Bir hata mesajı gösterilir
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 kullanın

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

  1. Firebase konsolunda Uzantılar bölümüne gidin
  2. Yönet ->Vektör Arama&#39;yı Firestore uzantısıyla 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ş parametresi ve sonuç değeri belgeleri
  4. Xcode'a geri dönün ve NotesRepository.swift uygulamasına gidin
  5. Aşağıdaki kodu dosyanın başına 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 ihtiyaç duyacağınız iç içe yerleştirilmiş bir prefilter özelliği de içerir.QueryResponse, uzantının yanıt yapısıyla eşleşir.
  6. Çağrılabilir işlevin 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
    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 []
      }
    }
    
    içinde çağrılabilir işlevin çağrısını güncelleyin

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

  1. Uygulamayı tekrar çalıştırın
  2. Notlarınızdan birindeki terimleri içeren bir arama sorgusu yazın
  3. Artık notlarınızı içeren filtrelenmiş bir liste göreceksiniz

Beklenen sonucu içeren uygulamanın ekran görüntüsü

Kullanıcı verilerine önceden filtre uygula

Kutlamak için dansa başlamadan önce uygulamanın mevcut sürümüyle ilgili bir sorun var: Sonuç kümesinde tüm kullanıcılara ait veriler yer alıyor.

Uygulamayı farklı bir simülatörde çalıştırarak ve daha fazla doküman ekleyerek bunu doğrulayabilirsiniz. Yeni dokümanlar yalnızca söz konusu simülasyon aracında görünür. Uygulamayı diğer simülasyon aracında yeniden çalıştırırsanız yalnızca ilk seferde 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 edeceksiniz. Bunu önlemek için ön filtre kullanmamız gerekir.

performQuery ürününde 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, giriş yapmış kullanıcının kimliğine göre verileri önceden filtreler. Tahmin edebileceğiniz gibi, bunun için Firestore dizininin güncellenmesi gerekir.

embedding alanında hem userId hem de vektör yerleştirmelerini içeren yeni bir Firestore dizini tanımlamak için komut satırında 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 derlemeyi tamamladıktan sonra, beklendiği gibi çalıştığını doğrulamak için uygulamayı tekrar çalıştırın

Önceden filtrelenmiş sonuç kümesi

8. Tebrikler

Tebrikler, bu codelab'i başarıyla tamamladınız.

Bu codelab'de şunları öğrendiniz:

  • Anlamsal aramanın etkin olduğu bir Cloud Firestore veritabanı kurun.
  • Veritabanıyla 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 arama çubuğu uygulayın.
  • Firestore SDK'sının Çağırılabilir 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 Cloud Firestore'un semantik arama özelliklerinden yararlanan güçlü uygulamalar geliştirerek kullanıcılara daha sezgisel ve verimli bir arama deneyimi sunabilirsiniz.

Firestore'un yeni vektör alanı ve vektör yerleştirmelerini hesaplama hakkında daha fazla bilgi edinmek için belgelere göz atın.