Uygulama Araması

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

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-alpha05"

    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-alpha05"

    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.

Diyagram
aşağıdakilerle olan etkileşimlerinin ana hatlarını belirleme
AppSearch kavramları: AppSearch veritabanı, şema, şema türleri, dokümanlar,
ve arama.. Ş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.

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);

Ş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:

Sorun izleyici

Düzeltebilmemiz için hataları bildirin.