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 anAppSearchClient
.
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 ofAppSearchSchema
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) .setInde xing Type(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 aGenericDocument
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 aGenericDocument
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 aSearchSpec
.
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. |