Work with search
The xConnect Client API allows you to search contacts (via client.Contacts
) and interactions (via client.Interactions
). Interaction search is also known as behavioral search. It is not possible to query events and facets directly - you must structure your query around contacts or interactions as demonstrated in the following table:
Query Requirement |
Query |
---|---|
Get all London addresses |
Get all contacts where the |
Get all page visits that occurred yesterday |
Get all interactions that occurred yesterday and contain events of type |
Get all ‘download’ events from the last week |
Get all interactions that occurred in the last week and contain |
Indexing
Indexing is performed by a dedicated search indexer, not by the processing server. This is a significant change from version 8.2 and earlier versions.
For more information about indexing and the architecture of xConnect search, see:
Synchronous and asynchronous search
Refer to the xConnect Client API overview for a complete list of synchronous and asynchronous extension methods.
xConnect does not use Sitecore.ContentSearch
xConnect search does not rely on Sitecore.ContentSearch
. xConnect search and Content Search are separate frameworks with separate APIs and indexing mechanisms. For more information, refer to the search and indexing overview.
Search is case-insensitive
Search is case-insensitive by default to make it easier to locate results. This is set at Solr schema level.
Support for joins depends on the search provider
Solr supports joins between contacts and interactions. Azure Search does not currently support joins.
The following example demonstrates how to search for any contact that has downloaded a particular media item. The query uses a join.
var mediaItemId = Guid.Parse("bf34c300-0c0a-4aab-9055-97854f17d134");
var query = client.Contacts.Where(c => c.Interactions.Any(x => x.Events.OfType<DownloadEvent>().Any(d => d.ItemId == mediaItemId)));
var results = await query.GetBatchEnumerator(10);
If you are using a search provider that does not support joins, you must use the contact’s InteractionsCache
facet:
var mediaItemId = Guid.Parse("bf34c300-0c0a-4aab-9055-97854f17d134");
var query = client.Contacts.Where(c => c.InteractionsCache().InteractionCaches.Any(x => x.DownloadEventItemIds.Any(f => f == mediaItemId)));
var results = await query.GetBatchEnumerator(10);