2024 AI & Machine LearningApp ServicesSwiftUI & UI Frameworks
WWDC24 · 11 min · AI & Machine Learning / App Services / SwiftUI & UI Frameworks
Support semantic search with Core Spotlight
Learn how to provide semantic search results in your app using Core Spotlight. Understand how to make your app’s content available in the user’s private, on-device index so people can search for items using natural language. We’ll also share how to optimize your app’s performance by scheduling indexing activities. To get the most out of this session, we recommend first checking out Core Spotlight documentation on the Apple Developer website.
Watch at developer.apple.com ↗Chapters
Code shown on screen · 14 snippets
Creating CSSearchableItem
// Creating searchable items for donation
let item = CSSearchableItem(uniqueIdentifier: uniqueIdentifier, domainIdentifier: domainIdentifier, attributeSet: attributeSet) Creating CSSearchableAttributeSet
// Creating searchable content for donation
let attributeSet = CSSearchableItemAttributeSet(contentType: UTType.text)
attributeSet.contentType = UTType.text.identifier Searchable items with type
// Searchable items with text
attributeSet.title
attributeSet.textContent
// Searchable items with media
attributeSet.contentType
attributeSet.contentURL
// Searchable items with links
attributeSet.contentURL
attributeSet.relatedUniqueIdentifier Batch indexing with client state
// Batch indexing with client state
let index = CSSearchableIndex(name: "SpotlightSearchSample")
index.fetchLastClientState { state, error in
if state == nil {
index.beginBatch()
index.indexSearchableItems(items)
index.endIndexBatch(expectedClientState: state, newClientState: newState) { error in
}
}
} Avoid overwriting existing attributes
// Make it an update to avoid overwriting existing attributes
item.isUpdate = true Configure a query
// Configure a query
let queryContext = CSUserQueryContext()
queryContext.fetchAttributes = ["title", "contentDescription"] Ranked results
// Ranked results
queryContext.enableRankedResults = true
queryContext.maxRankedResultCount = 2 Suggestions
// Suggestions
queryContext.maxSuggestionCount = 4 Filter queries
// Filter queries
queryContext.filterQueries = ["contentTypeTree=\"public.image\""] Query for searchable items and suggestions
// Query for searchable items and suggestions
let query = CSUserQuery(userQueryString: "windsurfing carmel", userQueryContext: queryContext)
for try await element in query.responses {
switch(element) {
case .item(let item):
self.items.append(item)
break
case .suggestion(let suggestion):
self.suggestions.append(suggestion)
break
}
} Suggestions
// Suggestions
suggestion.localizedAttributedSuggestion Preparing for queries
// Preparing for queries
CSUserQuery.prepare
CSUserQuery.prepareWithProtectionClasses Set the lastUsedDate
// Set the lastUsedDate when the user interacts with the item
item.attributeSet.lastUsedDate = Date.now
item.isUpdate = true Interactions with items and suggestions from a query
// Interactions with items and suggestions from a query
query.userEngaged(item, visibleItems: visibleItems, interaction: CSUserQuery.UserInteractionKind.select)
query.userEngaged(suggestion, visibleSuggestions: visibleSuggestions, interaction: CSUserQuery.UserInteractionKind.select) Resources
Related sessions
-
26 min -
17 min