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.
Öğ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
- Google Hesabınızı kullanarak Firebase konsolunda oturum açın.
- 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
).
- Devam'ı tıklayın.
- İstenirse Firebase şartlarını inceleyip kabul edin ve Devam'ı tıklayın.
- (İsteğe bağlı) Firebase konsolunda yapay zeka yardımını etkinleştirin ("Firebase'de Gemini" olarak adlandırılır).
- Bu codelab için Google Analytics'e ihtiyacınız yoktur. Bu nedenle, Google Analytics seçeneğini devre dışı bırakın.
- 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.
- Cloud Faturalandırma hesabı için kredi kartı gibi bir ödeme yöntemi gerekir.
- Firebase ve Google Cloud'u yeni kullanmaya başladıysanız 300 ABD doları değerinde kredi ve ücretsiz deneme Cloud Faturalandırma hesabı için uygun olup olmadığınızı kontrol edin.
- Bu codelab'i bir etkinliğin parçası olarak yapıyorsanız düzenleyicinize Cloud kredisi olup olmadığını sorun.
Projenizi Blaze planına yükseltmek için şu adımları uygulayın:
- Firebase konsolunda planınızı yükseltmeyi seçin.
- 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.
- Firebase konsolunun sol tarafındaki panelde Build > Authentication'ı (Oluştur > Kimlik Doğrulama) tıklayın. Ardından Başlayın'ı tıklayın.
- 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.
- Oturum açma yöntemi sekmesini seçin (veya doğrudan sekmeye gitmek için burayı tıklayın).
- 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:
- Firebase konsolunun sol panelinde Build'i (Oluştur) genişletin ve Firestore database'i (Firestore veritabanı) seçin.
- Create database'i (Veritabanı oluştur) tıklayın.
- Veritabanı Kimliği'ni
(default)
olarak bırakın. - 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. - 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. - 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:
- Firebase konsolunun sol panelinde Build'i (Oluştur) genişletin ve Storage'ı (Depolama) seçin.
- Başlayın'ı tıklayın.
- Varsayılan depolama paketinize bir konum seçin.
US-WEST1
,US-CENTRAL1
veUS-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. - 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. - 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
- https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios adresine gidin ve kod deposunu yerel makinenize klonlayın
- 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.
- Firebase konsolunda Firebase projenizin genel bakış sayfasına gidin.
- iOS uygulamanızı eklemek için iOS+ simgesini tıklayın.
- 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.
- Dilerseniz uygulama takma adı (ör. iOS için Notlar) girebilirsiniz.
- Sonraki adıma geçmek için Uygulamayı kaydet'i tıklayın.
- GoogleServices-Info.plist dosyasını indirin.
- 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.
- Gerekirse öğeleri kopyala'yı seçin, Hedeflere ekle'de Notlar hedefinin seçildiğinden emin olun ve Bitir'i tıklayın.
- 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.
- 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.
- Ardından, Çalıştır düğmesini tıklayın veya ⌘ + R tuşlarına basın.
- Uygulama Simülatör'de başarıyla başlatıldıktan sonra birkaç not ekleyin.
- Firebase konsolunda Firestore veri tarayıcısına gidin. Böylece, uygulamaya yeni notlar eklerken oluşturulan yeni belgeleri görebilirsiniz.
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
- Firestore bölümünde Uzantılar sekmesini tıklayın.
- Uzantı Merkezi'ni keşfedin'i tıklayın.
- "Vektör" yazın.
- "Vector Search with Firestore extension"ı (Firestore uzantısıyla Vector Search) tıklayın.
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.
- Firebase konsoluna yükle'yi tıklayın.
- Tüm projelerinizin listesi gösterilir.
- Bu codelab'in ilk adımında oluşturduğunuz projeyi seçin.
Uzantıyı yapılandırma
- Etkinleştirilen API'leri ve oluşturulan kaynakları inceleyin.
- Gerekli hizmetleri etkinleştirin.
- Tüm hizmetler etkinleştirildikten sonra Sonraki'yi tıklayın.
- Bu uzantıya inceleme erişimi verildi.
- 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
- 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.
- Uzantı yükleme işlemi tamamlandıktan sonra Başlayın düğmesini tıklayın.
- "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 örneğinize gitmek için Cloud Firestore kontrol paneli bağlantısını tıklayın.
_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.- Bunu doğrulamak için not belgelerinden birini açın.
embedding
türündevector<768>
adlı ek bir alanın yanı sıra birstatus
alanı görmeniz gerekir.
Örnek doküman oluşturma
Uzantıyı çalışırken görmek için Firebase konsolunda yeni bir belge oluşturabilirsiniz.
- Firestore veri tarayıcısında
notes
koleksiyonuna gidin ve orta sütunda + Belge ekle'yi tıklayın. - Yeni bir benzersiz belge kimliği oluşturmak için Otomatik kimlik'i tıklayın.
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.- 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 alanembedding
görmeniz gerekir.
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.
- Firebase konsolunun Firestore bölümünde
_firestore-vector-search/index
dokümanına gidin. - + Koleksiyon oluştur'u tıklayın.
queries
adlı yeni bir alt koleksiyon oluşturun.- 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). - Durumda bir hata görebilirsiniz.
- 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çin
- Cloud Log Explorer'da artık "FAILED_PRECONDITION: Missing vector index configuration. Lütfen aşağıdaki gcloud komutuyla gerekli dizini oluşturun: ..."
- Hata mesajında, eksik dizini yapılandırmak için çalıştırmanız gereken bir
gcloud
komutu da bulunur. - 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. Dizinin oluşturulması birkaç dakika sürer. İlerleme durumunu Firebase konsolunun Firestore bölümündeki Dizinler sekmesinden kontrol edebilirsiniz.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
- Dizin oluşturulduktan sonra yeni bir sorgu dokümanı oluşturabilirsiniz.
- Sonuçlar alanında eşleşen doküman kimliklerinin listesini görürsünüz
.
- Bu kimliklerden birini kopyalayın ve
notes
koleksiyonuna geri dönün. - Kopyaladığınız belge kimliğini aramak için ⌘+F tuşlarını kullanın. Bu belge, sorgunuzla en iyi eşleşen belgedir.
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.
- Xcode'a geri dönün ve bu codelab'in önceki bir adımında klonladığınız projede olduğunuzdan emin olun.
NotesRepository.swift
dosyasını açın.private lazy var vectorSearchQueryCallable: Callable
içeren satırı bulun.= functions.httpsCallable("")
Çağrılabilir bir Cloud Functions işlevini çağırmak için çağırmak istediğiniz işlevin adını sağlamanız gerekir.
- Projenizin Firebase konsoluna gidin ve Oluştur bölümünde İşlevler menü öğesini açın.
- Uzantı tarafından yüklenen işlevlerin listesini görürsünüz.
ext-firestore-vector-search-queryCallable
adlı olanı arayın ve adını kopyalayın.- 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
- Yöntemi bulma
performQuery
- Ç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.
- 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.
- Öncelikle
NotesListScreen.swift
- 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. - 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
- 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).
- 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.
- Notlar listesinin en üstünde bir arama alanı görürsünüz.
- 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).
- 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.
Bu, verileri yanlış biçimde gönderdiğiniz anlamına gelir.
Hata mesajını analiz etme
- Ne gibi bir sorun olduğunu öğrenmek için Firebase konsoluna gidin.
- İşlevler bölümüne gidin.
ext-firestore-vector-search-queryCallable
işlevini bulun, üç dikey noktayı tıklayarak taşma menüsünü açın.- Günlük Gezgini'ne gitmek için Günlükleri görüntüle'yi seçin.
- 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.
- Firebase konsolunda Uzantılar bölümüne gidin.
- Yönet ->
seçeneğini tıklayın.
- Bu uzantının çalışma şekli bölümünde, giriş ve çıkış parametrelerinin spesifikasyonunu bulabilirsiniz.
- Xcode'a geri dönün ve
NotesRepository.swift
bölümüne gidin. - 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ş birprefilter
özelliği de içerir.QueryResponse
, uzantının yanıtının yapısıyla eşleşir. - Ç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")
performQuery
içinde çağrılabilir işlevin çağrılmasını güncellemeprivate 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.
- Uygulamayı tekrar çalıştırın.
- Notlarınızdan birinde yer alan terimleri içeren bir arama sorgusu yazın.
- Artık filtrelenmiş not listesini görmelisiniz.
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.
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.