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.
Öğ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
- Firebase'de oturum açın.
- Firebase konsolunda Proje ekle'yi tıklayın, ardından projenizi Firestore Vektör Arama Laboratuvarı olarak adlandırın
- Proje oluşturma seçeneklerini tıklayın. İstenirse Firebase şartlarını kabul edin.
- 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.
- 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:
- Firebase konsolunda planınızı yükseltmeyi seçin.
- 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.
- Firebase konsolunun sol panelinde Derleme > Kimlik doğrulama'yı tıklayın. Ardından Başlayın'ı tıklayın.
- Ş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.
- Oturum açma yöntemi sekmesini seçin (veya doğrudan sekmeye gitmek için burayı tıklayın).
- 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:
- Firebase konsolunun sol panelinde Derleme'yi genişletin ve ardından Firestore veritabanı'nı seçin.
- Create database'i (Veritabanı oluştur) tıklayın.
- Veritabanı Kimliği'ni
(default)
olarak bırakın. - 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. - 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. - 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:
- Firebase konsolunun sol panelinde Derleme'yi genişletin ve ardından Depolama'yı seçin.
- Başlayın'ı tıklayın.
- Varsayılan Storage paketiniz için bir konum seçin.
US-WEST1
,US-CENTRAL1
veUS-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. - 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. - 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
- 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 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.
- 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 ekleyin ekranında, Xcode projesindeki paket kimliğini (com.google.firebase.codelab.Notes) ekleyin.
- Dilerseniz uygulamaya takma ad girebilirsiniz (iOS için Notlar).
- 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 Notlar 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 bölümünde Notlar hedefinin seçildiğinden emin olun ve Son'u tıklayın.
- 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.
- 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.
- 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.
- Uygulamaya yeni notlar eklerken oluşturulan yeni dokümanları görmek için Firebase konsolunda Firestore veri tarayıcısına gidin.
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
- Firestore bölümünde Uzantılar sekmesini tıklayın.
- Uzantı Merkezi'ni Keşfet'i tıklayın.
- "vector" yazın.
- "Firestore uzantılı vektör arama"yı tıklayın.
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.
- Firebase konsoluna yükle'yi tıklayın.
- Tüm projelerinizin listesi gösterilir.
- Bu kod laboratuvarının 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 verilen erişimi inceleyin.
- 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
- 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.
- Uzantı yüklendikten sonra Başlayın düğmesini tıklayın.
- "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.
- Dokümanları
- 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. 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.- Bunu doğrulamak için not belgelerinden birini açın.
vector<768>
türüne sahipembedding
adlı ek bir alanın yanı sıra birstatus
alanı görürsünüz.
Örnek doküman oluşturma
Uzantıyı çalışırken görmek için Firebase konsolunda yeni bir doküman oluşturabilirsiniz.
- Firestore veri tarayıcısında
notes
koleksiyonuna gidin ve orta sütunda + Doküman ekle'yi tıklayın. - Yeni bir benzersiz belge kimliği oluşturmak için Otomatik kimlik'i tıklayın.
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.- 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 birembedding
alanı görürsünüz.
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.
- Firebase konsolunun Firestore bölümünde
_firestore-vector-search/index
belgesine gidin - + Koleksiyon başlat'ı 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 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). - Durumda bir hata görebilirsiniz
- 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çin
- 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: ..."
- Hata mesajında, eksik dizini yapılandırmak için çalıştırmanız gereken bir
gcloud
komutu da bulunur. - 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. Dizinin oluşturulması birkaç dakika sürer. İlerleme durumunu Firebase konsolunun Firestore bölümündeki Dizine Eklemeler sekmesinde 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.
- Artık sonuçlar alanında eşleşen doküman kimliklerinin listesini göreceksiniz
- Bu kimliklerden birini kopyalayıp
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. 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.
- 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.
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 Derleme bölümündeki İşlevler menü öğesini açın.
- Uzantı tarafından yüklenen işlevlerin listesini görürsünüz.
ext-firestore-vector-search-queryCallable
adlı dosyayı arayın ve adını kopyalayın.- 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
performQuery
yöntemini bulun- 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.
- 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.
- Ö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, 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
- 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 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.
- Notlar listesinin en üstünde bir arama alanı görürsünüz.
- 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).
- 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.
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-queryCallable
işlevini bulun, üç dikey noktayı tıklayarak taşma menüsünü açın- Günlük gezginine gitmek için Günlükleri görüntüle'yi seçin.
- 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.
- Firebase konsolundaki 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 bir tanımını 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 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
'te çağrılabilir işlevin çağrılmasını güncelleyinprivate 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
- Uygulamayı tekrar çalıştırma
- Notlarınızdan birine dahil edilen terimleri içeren bir arama sorgusu yazın
- Filtrelenmiş not listesini göreceksiniz.
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.
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.