AppSearch, yerel olarak yönetmek için kullanılan yüksek performanslı cihaz üzerinde arama çözümüdür yapılandırılmış, yapılandırılmış verilere sahip olursunuz. Verileri dizine ekleme ve veri alma için API'ler içerir veya tam metin araması yapabilirsiniz. Uygulamalar, özel uygulama içi sunmak için AppSearch'ü kullanabilir Arama özellikleri, kullanıcıların çevrimdışıyken bile içerik aramasına olanak tanır.
![AppSearch'te dizine ekleme ve aramayı gösteren şema](https://developer.android.com/static/images/guide/topics/search/appsearch.png?authuser=4&hl=tr)
AppSearch aşağıdaki özellikleri sunar:
- Düşük G/Ç kullanımı ve hızlı, mobil öncelikli depolama alanı uygulaması
- Büyük veri kümelerinde son derece etkili dizinleme ve sorgulama
- İngilizce ve İspanyolca gibi çoklu dil desteği
- Alaka düzeyi sıralaması ve kullanım puanlaması
AppSearch, daha düşük G/Ç kullanımı nedeniyle dizine ekleme ve arama için daha düşük gecikme sunar. daha büyük veri kümelerinde kullanılıyor. AppSearch, türler arası sorguları basitleştirir tek sorguları destekleyerek SQLite'a birden fazla tablodan gelen sonuçları birleştirir.
AppSearch’ün özelliklerini göstermek için bir müzik kullanıcıların favori şarkılarını yöneten ve kullanıcıların kolayca arama yapmasına olanak tanıyan uygulama optimize edebilirsiniz. Kullanıcılar, farklı dillerdeki şarkı başlıklarıyla dünyanın her yerinden müzik dinliyor AppSearch'ün dizine ekleme ve sorgulamayı yerleşik olarak desteklediği dillerin sayısı. Kullanıcı bir şarkıyı başlığa veya sanatçı adına göre aradığında, uygulama Eşleşen şarkıları hızlı ve verimli bir şekilde almak için AppSearch'e istek gönderebilirsiniz. İlgili içeriği oluşturmak için kullanılan uygulama, sonuçları göstererek kullanıcılarının hızla oyun oynamaya başlamasını şarkıları.
Kurulum
Uygulamanızda AppSearch kullanmak için aşağıdaki bağımlılıkları
uygulamanın build.gradle
dosyası:
Eski
dependencies { def appsearch_version = "1.1.0-alpha04" implementation "androidx.appsearch:appsearch:$appsearch_version" // Use kapt instead of annotationProcessor if writing Kotlin classes annotationProcessor "androidx.appsearch:appsearch-compiler:$appsearch_version" implementation "androidx.appsearch:appsearch-local-storage:$appsearch_version" // PlatformStorage is compatible with Android 12+ devices, and offers additional features // to LocalStorage. implementation "androidx.appsearch:appsearch-platform-storage:$appsearch_version" }
Kotlin
dependencies { val appsearch_version = "1.1.0-alpha04" implementation("androidx.appsearch:appsearch:$appsearch_version") // Use annotationProcessor instead of kapt if writing Java classes kapt("androidx.appsearch:appsearch-compiler:$appsearch_version") implementation("androidx.appsearch:appsearch-local-storage:$appsearch_version") // PlatformStorage is compatible with Android 12+ devices, and offers additional features // to LocalStorage. implementation("androidx.appsearch:appsearch-platform-storage:$appsearch_version") }
AppSearch kavramları
Aşağıdaki şemada, AppSearch kavramları ve bunların etkileşimleri gösterilmektedir.
.
Şekil 1. AppSearch kavramlarının diyagramı: AppSearch veritabanı, şema,
ve aramadan bahsedeceğiz.
Veritabanı ve oturum
AppSearch veritabanı, veritabanına uygun dokümanlardan oluşan bir koleksiyondur şema. İstemci uygulamaları, kendi uygulamalarını sağlayarak bir veritabanı oluşturur. bir bağlam ve bir veritabanı adı yazın. Veritabanları yalnızca uygulama tarafından açılabilir bir sürü bilgi var. Bir veritabanı açıldığında, etkileşim sağlamak için bir oturum döndürülür gerekiyor. Oturum, AppSearch API'lerini çağırmak için giriş noktasıdır ve istemci uygulaması tarafından kapatılana kadar açık kalır.
Şema ve şema türleri
Şema, AppSearch içindeki verilerin kurumsal yapısını gösterir
Şema, benzersiz veri türlerini temsil eden şema türlerinden oluşur. Şema türleri; ad, veri türü ve kardinalite. Veritabanı şemasına bir şema türü eklendikten sonra, oluşturulup veritabanına eklenebilmesidir.
Dokümanlar
AppSearch'te bir veri birimi, belge olarak temsil edilir. Her bir doküman, AppSearch veritabanı, ad alanı ve kimliğiyle benzersiz bir şekilde tanımlanır. Ad alanları yalnızca tek bir kaynağın gerektiğinde farklı kaynaklardan verileri ayırmak için kullanılır diğer verileri içerebilir.
Belgelerde oluşturma zaman damgası, geçerlilik süresi (TTL) ve alma sırasında sıralama için kullanılabilir. Bir dokümana şema atanmış dokümanın sahip olması gereken ek veri özelliklerini açıklayan bir türdür.
Belge sınıfı, bir dokümanın soyutlamasıdır. Ek açıklamalı alanlar içerir bir doküman içeriğini temsil eden resim etiketleri için de kullanılır. Varsayılan olarak dokümanın adı class, şema türünün adını belirler.
Arama
Dokümanlar dizine eklenir ve sorgu sağlanarak aranabilir. Belge, sorgudaki terimleri içeriyorsa eşleştirilir ve arama sonuçlarına eklenir veya başka bir arama spesifikasyonuyla eşleşir. Sonuçlar, arama ölçütlerine göre puan ve sıralama stratejisi. Arama sonuçları, isimleri hızlı ve kolay bir şekilde almanın en iyi yoludur.
AppSearch özelleştirmeler sunar (ör. filtreler, sayfa boyutu yapılandırması ve snippet'ler)
Platform Storage - Yerel Depolama Alanı
AppSearch, LocalStorage ve PlatformStorage olmak üzere iki depolama çözümü sunar. Yerel Depolama ile uygulamanız, şurada bulunan uygulamaya özgü bir dizini yönetir: uygulama veri dizininiz olur. PlatformStorage ile uygulamanız sistem genelinde merkezi endekslere katkı sağlar. Merkezi dizinde veri erişimi uygulamanızın katkıda bulunduğu veriler ve Sizinle başka bir uygulama tarafından açıkça paylaşılan. Hem LocalStorage hem de PlatformStorage aynı API'yi paylaşır ve cihazın özelliklerine göre değiştirilebilir. sürüm:
Kotlin
if (BuildCompat.isAtLeastS()) { appSearchSessionFuture.setFuture( PlatformStorage.createSearchSession( PlatformStorage.SearchContext.Builder(mContext, DATABASE_NAME) .build() ) ) } else { appSearchSessionFuture.setFuture( LocalStorage.createSearchSession( LocalStorage.SearchContext.Builder(mContext, DATABASE_NAME) .build() ) ) }
Java
if (BuildCompat.isAtLeastS()) { mAppSearchSessionFuture.setFuture(PlatformStorage.createSearchSession( new PlatformStorage.SearchContext.Builder(mContext, DATABASE_NAME) .build())); } else { mAppSearchSessionFuture.setFuture(LocalStorage.createSearchSession( new LocalStorage.SearchContext.Builder(mContext, DATABASE_NAME) .build())); }
Uygulamanız, PlatformStorage'ı kullanarak diğer kullanıcılarla güvenli bir şekilde veri paylaşabilir. uygulama verileri. Salt okunur uygulamanın veri paylaşımına sertifika el sıkışması ile izin verilir. Bu sayede, diğer uygulama verileri okuma iznine sahip olur. Bu API hakkında daha fazla bilgi setSchemaTypeGörünürlükForPackage() ile ilgili belgelere göz atın.
Ayrıca, dizine eklenen veriler Sistem kullanıcı arayüzü yüzeylerinde görüntülenebilir. Uygulamalar, verilerinin bir kısmının veya tamamının Sistem'de görüntülenmesini devre dışı bırakabilir Kullanıcı arayüzü yüzeyleri. Bu API hakkında daha fazla bilgiye setSchemaTypeDisplayedBySystem() belgelerinde ulaşabilirsiniz.
Özellikler | LocalStorage (compatible with Android 4.0+) |
PlatformStorage (compatible with Android 12+) |
---|---|---|
Efficient full-text search |
||
Multi-language support |
||
Reduced binary size |
||
Application-to-application data sharing |
||
Capability to display data on System UI surfaces |
||
Unlimited document size and count can be indexed |
||
Faster operations without additional binder latency |
Yerel Depolama Alanı arasında seçim yaparken dikkate alınması gereken ek durumlar da vardır. ve PlatformStorage'a hoş geldiniz. Çünkü PlatformStorage, Jetpack API'lerini AppSearch sistem hizmetinin APK boyutuna etkisi, Yerel Depolama'ya dokunun. Ancak bu, AppSearch işlemlerinin ek ödeme gerektirebileceği anlamına da AppSearch sistem hizmeti çağrılırken bağlayıcı gecikmesi. PlatformStorage ile AppSearch, bir uygulamadaki doküman sayısını ve doküman boyutunu sınırlandırır endekslemenin etkili bir yoludur.
AppSearch'ü kullanmaya başlama
Bu bölümdeki örnekte, Google Ads ile entegre etmek için bir proje yönetimi metodolojisi oluşturacağız.
Belge sınıfı yazma
AppSearch ile entegrasyon için ilk adım,
veri tabanına eklenecek verileri tanımlamalıdır. Bir sınıfı doküman sınıfı olarak işaretleme
@Document
Not.Dokümanları içeriye yerleştirmek için belge sınıfının örneklerini kullanabilir ve
veritabanından doküman alma.
Aşağıdaki kod,
@Document.StringProperty
ek açıklamalı
alanını kullanır.
Kotlin
@Document public data class Note( // Required field for a document class. All documents MUST have a namespace. @Document.Namespace val namespace: String, // Required field for a document class. All documents MUST have an Id. @Document.Id val id: String, // Optional field for a document class, used to set the score of the // document. If this is not included in a document class, the score is set // to a default of 0. @Document.Score val score: Int, // Optional field for a document class, used to index a note's text for this // document class. @Document.StringProperty(indexingType = AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_PREFIXES) val text: String )
Java
@Document public class Note { // Required field for a document class. All documents MUST have a namespace. @Document.Namespace private final String namespace; // Required field for a document class. All documents MUST have an Id. @Document.Id private final String id; // Optional field for a document class, used to set the score of the // document. If this is not included in a document class, the score is set // to a default of 0. @Document.Score private final int score; // Optional field for a document class, used to index a note's text for this // document class. @Document.StringProperty(indexingType = StringPropertyConfig.INDEXING_TYPE_PREFIXES) private final String text; Note(@NonNull String id, @NonNull String namespace, int score, @NonNull String text) { this.id = Objects.requireNonNull(id); this.namespace = Objects.requireNonNull(namespace); this.score = score; this.text = Objects.requireNonNull(text); } @NonNull public String getNamespace() { return namespace; } @NonNull public String getId() { return id; } public int getScore() { return score; } @NonNull public String getText() { return text; } }
Veritabanı açma
Dokümanlarla çalışmaya başlamadan önce veritabanı oluşturmanız gerekir. Aşağıdaki kod
adında yeni bir veritabanı oluşturur ve ListenableFuture
alırnotes_app
AppSearchSession
için
Bu grafik, veritabanıyla olan bağlantıyı temsil eder ve
işlemleri için kullanılır.
Kotlin
val context: Context = getApplicationContext() val sessionFuture = LocalStorage.createSearchSession( LocalStorage.SearchContext.Builder(context, /*databaseName=*/"notes_app") .build() )
Java
Context context = getApplicationContext(); ListenableFuture<AppSearchSession> sessionFuture = LocalStorage.createSearchSession( new LocalStorage.SearchContext.Builder(context, /*databaseName=*/ "notes_app") .build() );
Şema ayarlama
Dokümanları yerleştirmeden ve geri almadan önce bir şema oluşturmanız gerekir bu verileri veritabanından kaldırır. Veritabanı şeması, "şema türleri" olarak adlandırılan yapılandırılmış verilerin bir arada kullanılmasıdır. Aşağıdaki kod, şemasını oluşturabilirsiniz.
Kotlin
val setSchemaRequest = SetSchemaRequest.Builder().addDocumentClasses(Note::class.java) .build() val setSchemaFuture = Futures.transformAsync( sessionFuture, { session -> session?.setSchema(setSchemaRequest) }, mExecutor )
Java
SetSchemaRequest setSchemaRequest = new SetSchemaRequest.Builder().addDocumentClasses(Note.class) .build(); ListenableFuture<SetSchemaResponse> setSchemaFuture = Futures.transformAsync(sessionFuture, session -> session.setSchema(setSchemaRequest), mExecutor);
Veritabanına doküman yerleştirme
Bir şema türü eklendikten sonra, veritabanına söz konusu türdeki dokümanları ekleyebilirsiniz.
Aşağıdaki kod, Note
öğesini kullanarak Note
şema türünde bir doküman oluşturur
doküman sınıf oluşturucu. user1
doküman ad alanını
rastgele bir kullanıcısı vardır. Ardından doküman, veritabanına eklenir.
ve yerleştirme işleminin sonucunu işlemek için bir dinleyici eklenir.
Kotlin
val note = Note( namespace="user1", id="noteId", score=10, text="Buy fresh fruit" ) val putRequest = PutDocumentsRequest.Builder().addDocuments(note).build() val putFuture = Futures.transformAsync( sessionFuture, { session -> session?.put(putRequest) }, mExecutor ) Futures.addCallback( putFuture, object : FutureCallback<AppSearchBatchResult<String, Void>?> { override fun onSuccess(result: AppSearchBatchResult<String, Void>?) { // Gets map of successful results from Id to Void val successfulResults = result?.successes // Gets map of failed results from Id to AppSearchResult val failedResults = result?.failures } override fun onFailure(t: Throwable) { Log.e(TAG, "Failed to put documents.", t) } }, mExecutor )
Java
Note note = new Note(/*namespace=*/"user1", /*id=*/ "noteId", /*score=*/ 10, /*text=*/ "Buy fresh fruit!"); PutDocumentsRequest putRequest = new PutDocumentsRequest.Builder().addDocuments(note) .build(); ListenableFuture<AppSearchBatchResult<String, Void>> putFuture = Futures.transformAsync(sessionFuture, session -> session.put(putRequest), mExecutor); Futures.addCallback(putFuture, new FutureCallback<AppSearchBatchResult<String, Void>>() { @Override public void onSuccess(@Nullable AppSearchBatchResult<String, Void> result) { // Gets map of successful results from Id to Void Map<String, Void> successfulResults = result.getSuccesses(); // Gets map of failed results from Id to AppSearchResult Map<String, AppSearchResult<Void>> failedResults = result.getFailures(); } @Override public void onFailure(@NonNull Throwable t) { Log.e(TAG, "Failed to put documents.", t); } }, mExecutor);
Arama
Şurada bahsedilen arama işlemleri kullanılarak dizine eklenen dokümanları arayabilirsiniz:
bu bölümde bulabilirsiniz. Aşağıdaki kod "meyve" terimi için sorgu gerçekleştirir. şunun üzerinde:
user1
ad alanına ait dokümanlar için veritabanı oluşturma
Kotlin
val searchSpec = SearchSpec.Builder() .addFilterNamespaces("user1") .build(); val searchFuture = Futures.transform( sessionFuture, { session -> session?.search("fruit", searchSpec) }, mExecutor ) Futures.addCallback( searchFuture, object : FutureCallback<SearchResults> { override fun onSuccess(searchResults: SearchResults?) { iterateSearchResults(searchResults) } override fun onFailure(t: Throwable?) { Log.e("TAG", "Failed to search notes in AppSearch.", t) } }, mExecutor )
Java
SearchSpec searchSpec = new SearchSpec.Builder() .addFilterNamespaces("user1") .build(); ListenableFuture<SearchResults> searchFuture = Futures.transform(sessionFuture, session -> session.search("fruit", searchSpec), mExecutor); Futures.addCallback(searchFuture, new FutureCallback<SearchResults>() { @Override public void onSuccess(@Nullable SearchResults searchResults) { iterateSearchResults(searchResults); } @Override public void onFailure(@NonNull Throwable t) { Log.e(TAG, "Failed to search notes in AppSearch.", t); } }, mExecutor);
Arama Sonuçlarını yineleyin
Aramalar SearchResults
döndürür.
Örneğin, SearchResult
nesnelerinin sayfalarına erişim izni verir. Her SearchResult
eşlemenin genel biçimi olan GenericDocument
dönüştürüldüğü bir belgedir. Aşağıdaki kod ilk
arama sonuçları sayfasına ekler ve sonucu tekrar Note
dokümanına dönüştürür.
Kotlin
Futures.transform( searchResults?.nextPage, { page: List<SearchResult>? -> // Gets GenericDocument from SearchResult. val genericDocument: GenericDocument = page!![0].genericDocument val schemaType = genericDocument.schemaType val note: Note? = try { if (schemaType == "Note") { // Converts GenericDocument object to Note object. genericDocument.toDocumentClass(Note::class.java) } else null } catch (e: AppSearchException) { Log.e( TAG, "Failed to convert GenericDocument to Note", e ) null } note }, mExecutor )
Java
Futures.transform(searchResults.getNextPage(), page -> { // Gets GenericDocument from SearchResult. GenericDocument genericDocument = page.get(0).getGenericDocument(); String schemaType = genericDocument.getSchemaType(); Note note = null; if (schemaType.equals("Note")) { try { // Converts GenericDocument object to Note object. note = genericDocument.toDocumentClass(Note.class); } catch (AppSearchException e) { Log.e(TAG, "Failed to convert GenericDocument to Note", e); } } return note; }, mExecutor);
Doküman kaldırma
Kullanıcı bir notu sildiğinde uygulama, ilgili Note
notunu da siler.
kaldıracak. Bu işlem, notun artık
daha fazla bilgi edineceksiniz. Aşağıdaki kod, Note
öğesinin kaldırılması için açık bir istekte bulunuyor
ID'ye göre veritabanından doküman oluşturma
Kotlin
val removeRequest = RemoveByDocumentIdRequest.Builder("user1") .addIds("noteId") .build() val removeFuture = Futures.transformAsync( sessionFuture, { session -> session?.remove(removeRequest) }, mExecutor )
Java
RemoveByDocumentIdRequest removeRequest = new RemoveByDocumentIdRequest.Builder("user1") .addIds("noteId") .build(); ListenableFuture<AppSearchBatchResult<String, Void>> removeFuture = Futures.transformAsync(sessionFuture, session -> session.remove(removeRequest), mExecutor);
Diske devam et
Veritabanı güncellemelerinin
requestFlush()
. İlgili içeriği oluşturmak için kullanılan
aşağıdaki kod, çağrının dinleyiciyle birlikte requestFlush()
işlevini çağırarak
başarılı oldu.
Kotlin
val requestFlushFuture = Futures.transformAsync( sessionFuture, { session -> session?.requestFlush() }, mExecutor ) Futures.addCallback(requestFlushFuture, object : FutureCallback<Void?> { override fun onSuccess(result: Void?) { // Success! Database updates have been persisted to disk. } override fun onFailure(t: Throwable) { Log.e(TAG, "Failed to flush database updates.", t) } }, mExecutor)
Java
ListenableFuture<Void> requestFlushFuture = Futures.transformAsync(sessionFuture, session -> session.requestFlush(), mExecutor); Futures.addCallback(requestFlushFuture, new FutureCallback<Void>() { @Override public void onSuccess(@Nullable Void result) { // Success! Database updates have been persisted to disk. } @Override public void onFailure(@NonNull Throwable t) { Log.e(TAG, "Failed to flush database updates.", t); } }, mExecutor);
Oturumu kapatma
AppSearchSession
Bir uygulama artık hiçbir veritabanını çağırmadığında kapatılmalıdır.
anlamına gelir. Aşağıdaki kod, açılan AppSearch oturumunu kapatır
kontrol eder ve diskteki tüm güncellemeleri uygular.
Kotlin
val closeFuture = Futures.transform<AppSearchSession, Unit>(sessionFuture, { session -> session?.close() Unit }, mExecutor )
Java
ListenableFuture<Void> closeFuture = Futures.transform(sessionFuture, session -> { session.close(); return null; }, mExecutor);
Ek kaynaklar
AppSearch hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın:
Örnekler
- Android AppSearch Örneği (Kotlin), bir kullanıcının notlarını dizine eklemek için AppSearch'ü kullanan ve kullanıcıların not almalarına olanak tanıyan bir not alma uygulaması notlarında arama yapabilir.
Geri bildirim gönder
Aşağıdaki kaynakları kullanarak geri bildiriminizi ve düşüncelerinizi bizimle paylaşın:
Düzeltebilmemiz için hataları bildirin.