Provides access to the centralized AppSearch index maintained by the system.
AppSearch is an offline, on-device search library for managing structured data featuring:
- APIs to index and retrieve data via full-text search.
- An API for applications to explicitly grant read-access permission of their data to
other applications. See:
SetSchemaRequest.Builder.setSchemaTypeVisibilityForPackage(String, boolean, PackageIdentifier)
- An API for applications to opt into or out of having their data displayed on System UI
surfaces by the System-designated global querier. See:
SetSchemaRequest.Builder.setSchemaTypeDisplayedBySystem(String, boolean)
Applications create a database by opening an AppSearchClient
.
Example:
AppSearchManager appSearchManager = context.getSystemService(AppSearchManager.class); AppSearchManager.SearchContext searchContext = new AppSearchManager.SearchContext.Builder(). setDatabaseName(dbName).build()); appSearchManager.createSearchSession(searchContext, mExecutor, AppSearchClientResult -> { mAppSearchClient = AppSearchClientResult.getResultValue(); });
After opening the session, a schema must be set in order to define the organizational
structure of data. The schema is set by calling
AppSearchClient.setSchema(SetSchemaRequest, String)
. The schema is composed of a
collection of AppSearchSchema
objects, each of which defines a unique type of data.
Example:
AppSearchSchema emailSchemaType = new AppSearchSchema.Builder("Email") .addProperty(new StringPropertyConfig.Builder("subject") .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL) .setIndexingType(PropertyConfig.INDEXING_TYPE_PREFIXES) .setTokenizerType(PropertyConfig.TOKENIZER_TYPE_PLAIN) .build() ).build(); SetSchemaRequest request = new SetSchemaRequest.Builder().addSchema(emailSchemaType).build(); mAppSearchClient.set(request, mExecutor, appSearchResult -> { if (appSearchResult.isSuccess()) { // Schema has been successfully set. } });
The basic unit of data in AppSearch is represented as a GenericDocument
object, containing an ID, namespace, time-to-live, score, and properties. A namespace
organizes a logical group of documents. For example, a namespace can be created to group
documents on a per-account basis. An ID identifies a single document within a namespace. The
combination of namespace and ID uniquely identifies a GenericDocument
in the database.
Once the schema has been set, GenericDocument
objects can be put into the database and indexed by calling
AppSearchClient.put(PutDocumentsRequest, String)
.
Example:
// Although for this example we use GenericDocument directly, we recommend extending // GenericDocument to create specific types (i.e. Email) with specific setters/getters. GenericDocument email = new GenericDocument.Builder<>(NAMESPACE, ID, EMAIL_SCHEMA_TYPE) .setPropertyString(“subject”, EMAIL_SUBJECT) .setScore(EMAIL_SCORE) .build(); PutDocumentsRequest request = new PutDocumentsRequest.Builder().addGenericDocuments(email) .build(); mAppSearchClient.put(request, mExecutor, appSearchBatchResult -> { if (appSearchBatchResult.isSuccess()) { // All documents have been successfully indexed. } });
Searching within the database is done by calling
AppSearchClient.search(String, SearchSpec, String)
and providing the query string
to search for, as well as a SearchSpec
.
Alternatively,
AppSearchClient.getByDocumentId(GetByDocumentIdRequest, String)
can be called to
retrieve documents by namespace and ID.
Document removal is done either by time-to-live expiration, or explicitly calling a remove
operation. Remove operations can be done by namespace and ID via
AppSearchClient.remove(RemoveByDocumentIdRequest, String)
, or by query via
AppSearchClient.remove(String, SearchSpec, String)
.
Nested Class Summary
class | AppSearchManager.SearchContext | Contains information about how to create the search session. |