What is Content Testing?
Sitecore Content Testing finds most effective content variations. It is aimed to improve user experience via testing various content variations and picking top influencing ones.
How content optimization are decisions made?
Decisions are made by aggregating live site visitors behavior for each variant.
How does it know what content to test?
Sitecore_suggested_test_index has computed values for all of the eligible items in the content tree to be optimized.
What is the performance price to pay?
- Index should be rebuilt periodically (daily) for fresh data
- Aggregation extracts extra bits from tracked data
- Item-level API always checks if item under test (a few versions of same content may exist simultaneously)
Room for improvement in every step
Suggested Test index
Content Testing index attempts to index everything under the /sitecore/content
...
<locations hint="list:AddCrawler">
<crawler type="Sitecore.ContentTesting.ContentSearch.SpecificSitecoreItemCrawler, Sitecore.ContentTesting">
<Database>master</Database>
<!-- Limit this parameter to the root of the content of the site. -->
<Root>/sitecore/content</Root>
</crawler>
</locations>
Default config has a comment to narrow crawler root to actual stored content.
The ‘exclude‘ node allows some items to not be added into the index:
...
<documentOptions ref="contentSearch/indexConfigurations/defaultSolrIndexConfiguration/documentOptions">
<indexAllFields>false</indexAllFields>
<exclude hint="list:AddExcludedTemplate">
<folder>{A87A00B1-E6DB-45AB-8B54-636FEC3B5523}</folder>
<mainSection>{E3E2D58C-DF95-4230-ADC9-279924CECE84}</mainSection>
</exclude>
By default, everything would be indexed by Sitecore (except 2 templates).
Knowing which items are actually content ones (thereby are eligible for testing) enables us to exclude others, hence let system operate with less data.
Item by template content statistics
The query locates all items under site node and groups them by template id:
WITH ContentItems AS (
SELECT
DISTINCT(ID)
FROM Items
WHERE
ParentID = '{0DE95AE4-41AB-4D01-9EB0-67441B7C2450}' -- Content item ID, change to relevant one
UNION ALL
SELECT
m.ID
FROM Items m
JOIN ContentItems q ON m.parentID = q.ID),
PopularItemTemplates(TemplateID, Hits) AS (
SELECT
[TemplateID],
Count(1)
FROM Items i
JOIN ContentItems u ON u.ID = i.ID
GROUP BY
TemplateID
HAVING
Count(1) > 300)
SELECT
t.TemplateID,
i.[Name] AS [TemplateName],
t.[Hits] AS 'Based on template'
FROM PopularItemTemplates t
JOIN Items i ON t.TemplateID = i.ID
ORDER BY
t.Hits DESC
A list of most popular templates under content root is given for a review.
Indexing results
3 times less documents getting stored in index (24K vs 8K) in our success story.
Aggregation and Reporting
Sitecore provides hotfix to make aggregation run faster.
Additionally, you might want to follow Azure query advisor recommendations as it analyzes your database workload and provides suggestions specifically for that load.
High SQL Server load when updating the sitecore_suggested_test_index has index optimization suggestions as well.
Get Item operation
Content testing influences getItem
pipeline by adding own processor. That is needed to let different versions of item co-exist at the same time.
This functionality was optimized in Sitecore 9.1+ (ref. 215433).
One thought on “Optimizing resources for Content Testing”