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 Vektör Arama uzantısını yükleme
- Firebase Cloud Functions'ı Swift uygulamasından çağırma
- Verileri, oturum açmış kullanıcıya göre önceden filtreleme
Gerekenler
- Xcode 15.3
- Codelab'deki örnek kod. Bunu, codelab'in sonraki bir adımında indireceksiniz.
2. Firebase projesi oluşturma ve ayarlama
Firebase Vektör Arama uzantısını kullanmak için bir Firebase projeniz 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 temelindeki 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 kullanmaya yeni 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 geçirmek için aşağıdaki 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ştirilmesi 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ğrulama kullanır. Bu sayede, kullanıcıların kaydolma sürecinde karşılaştığı zorluklar azaltılı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, verilerinizi güvence altına almak 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 ayarlama
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-CENTRAL1veUS-EAST1bö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, verilerinizi güvence altına almak için güvenlik kuralları ekleyeceksiniz. Depolamapaketinize güvenlik kuralları eklemeden bir 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.
- 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çili olduğundan emin olun ve Bitir'i tıklayın.

- Firebase konsolunda, kurulum sürecinin geri kalanını tamamlamak için tıklayabilirsiniz: 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
Şimdi uygulamayı deneme zamanı!
- 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. Firestore ile Vector Search uzantısını yükleme
Bu 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ü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.
- "Firestore uzantısıyla vektör arama"yı 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 vektör yerleştirmeleri 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ğın büyük bir metin külliyatı üzerinde eğitilmesi ve kelimeler arasındaki ilişkilerin öğrenilmesiyle 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ı deneme
Bu codelab'in başında indirdiğiniz iOS uygulamasında Vector Search with Firestore uzantısını kullanmadan önce uzantıyı Firebase konsolunda deneyebilirsiniz.
Belgeleri okuyun
Firebase Uzantıları, nasıl çalıştıklarıyla ilgili belgeler içerir.
- Uzantının yüklenmesi 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 konular açıklanmaktadır:
- Dokümanları
noteskoleksiyonuna 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önderileceği,- veya
_firestore-vector-search/index/querieskoleksiyonuna bir sorgu belgesi ekleyerek dizine nasıl sorgu göndereceğinizi öğrenin. - Ayrıca özel yerleştirme işlevinin nasıl ayarlanacağını da açıklar. Bu, uzantı tarafından desteklenen LLM'lerin hiçbiri gereksinimlerinizi karşılamıyorsa ve yerleştirmeleri hesaplamak için farklı bir LLM kullanmak istiyorsanız yararlıdır.

- Dokümanları
- Firestore örneğinize gitmek için Cloud Firestore kontrol paneli bağlantısını tıklayın.
_firestore-vector-search/indexdokümanına gidin. Uzantının, bu codelab'in önceki bir adımında oluşturduğunuz tüm not belgeleri için yerleştirmeleri hesaplamayı tamamladığı gösterilmelidir.
- Bunu doğrulamak için not belgelerinden birini açın.
embeddingtüründevector<768>adlı ek bir alanın yanı sıra birstatusalanı 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
noteskoleksiyonuna gidin ve orta sütunda + Add document'ı (+ Belge ekle) tıklayın.
- Yeni bir benzersiz belge kimliği oluşturmak için Otomatik kimlik'i tıklayın.
textadlı 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,
embeddingdeğerine sahip yeni bir alanvector<768>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/indexdokümanına gidin. - + Koleksiyonu başlat'ı tıklayın.

queriesadlı yeni bir alt koleksiyon oluşturun.- Yeni bir doküman oluşturun ve
queryalanı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 sorgularla ç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." şeklinde bir hata mesajı görmeniz gerekir. 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
gcloudkomutu da bulunur. - Komut satırınızda aşağıdaki komutu çalıştırın. Makinenizde
gcloudCLI 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 ayarlandıktan 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
noteskoleksiyonuna 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ı Firestore ile Vektör Arama 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 Vektör Arama uzantısı, bu codelab'de daha önce oluşturduğunuz dizine sorgu göndermek 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 bağlantı kuracaksı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.swiftdosyasını açın.private lazy var vectorSearchQueryCallable: Callableiç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-queryCallableadlı 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şağıdaki kodu çağırarak çağrılabilir işlevinizi çağırın:
let result = try await vectorSearchQueryCallable(searchTerm)
Bu uzak bir arama olduğundan başarısız olabilir.
- Hataları yakalamak ve 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ştiricileri sayesinde bu işlem için yalnızca birkaç satır kod gerekir.
- Öncelikle
NotesListScreen.swiftuygulamasını açın. - 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ı vermiş olursunuz. 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 aşağıdaki gibi 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, yine en iyi sonucu "Swift'ten eşzamansız Firebase API'lerini nasıl çağırabilirim?" gibi semantik sorgularda verir (eklediğiniz notlardan en az birinde bu konuyu ele alan bir metin olması koşuluyla).
- 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
- Sorunun ne olduğunu öğrenmek için Firebase konsoluna gidin.
- İşlevler bölümüne gidin.
ext-firestore-vector-search-queryCallableiş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ı nasıl çalışır? bölümünde giriş ve çıkış parametrelerinin özelliklerini bulabilirsiniz.

- Xcode'a geri dönün ve
NotesRepository.swiftbö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 bulup giriş ve çıkış türlerini güncelleme
private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable") performQueryiç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.
Uygulamayı farklı bir simülatörde çalıştırıp daha fazla doküman ekleyerek bunu doğrulayabilirsiniz. Yeni dokümanlar yalnızca söz konusu 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ü fark edeceksiniz. 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:
- Anlamsal 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 kullanıcılara daha sezgisel ve verimli bir arama deneyimi sunmak için Cloud Firestore'un semantik 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 belgelere göz atın.