This applies to those setting up Azure Search to work with a Sitecore Helix architecture based on the Habitat example and using Sitecore 8.2 Update 3.
Depending on your use case Azure Search is a smart option if you’re hosting in the cloud. The main upside it likely has over SOLR is that its run as PaaS and you don’t need to delve into the SOLR setting files in order to enact scaling and replication. Nor does it require a true Virtual Machine running tomcat, that you may at times need to know how to administer. I’m not suggesting that SOLR isn’t a great project (it is) but it does have a learning curve if you need to tweak things under the hood. Azure Search also has its limitations as listed on this page.
If you’re following the setup instructions (like I was) there is a fairly lengthy step that involves you switching over configuration files. Basically, on a default installation, you need to disable/delete all Lucene file system based configuration files and enable a number of Azure configuration files for Azure Search PaaS.
Using Helix and gulp in Visual Studio all members of your team are probably going to need to replicate these setup steps (without doing anything manually in the running IIS developer instance). So here are two tricks I used:
ConnectionStrings
Under your Foundation.Indexing module I placed a file called:
ConnectionString.config.transform
<?xml version="1.0" encoding="utf-8"?> <connectionStrings xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <add name="cloud.search" connectionString="serviceUrl=https://mysearchinstance.search.windows.net;apiVersion=2015-02-28-Preview;apiKey=7CA4...5" xdt:Transform="Insert"/> </connectionStrings>
Gulp Config Rename
In order to automate the deletion of all the Lucene config files I wrote the following Gulp task:
/***************************** https://doc.sitecore.net/sitecore_experience_platform/setting_up_and_maintaining/search_and_indexing/configure_azure_search#_Create_a_Search // If running on Azure Search we need to disable lucene default configs *****************************/ gulp.task('Z-Search-Disable-Lucene-Configs', function () { var root = config.websiteRoot + "/App_Config/Include/"; var socialRoot = config.websiteRoot + "/App_Config/Include/social/"; var listManagementRoot = config.websiteRoot + "/App_Config/Include/ListManagement/"; var fxmRoot = config.websiteRoot + "/App_Config/Include/FXM/"; var testingRoot = config.websiteRoot + "/App_Config/Include/ContentTesting/"; // Main root config folder var roots = [root + "Sitecore.ContentSearch.Lucene.DefaultIndexConfiguration.config", root + "Sitecore.ContentSearch.Lucene.Index.Analytics.config", root + "Sitecore.ContentSearch.Lucene.Index.Core.config", root + "Sitecore.ContentSearch.Lucene.Index.Master.config", root + "Sitecore.ContentSearch.Lucene.Index.Web.config", root + "Sitecore.Marketing.Lucene.Index.Master.config", root + "Sitecore.Marketing.Lucene.Index.Web.config", root + "Sitecore.Marketing.Lucene.IndexConfiguration.config", root + "Sitecore.Marketing.Definitions.MarketingAssets.Repositories.Lucene.Index.Master.config", root + "Sitecore.Marketing.Definitions.MarketingAssets.Repositories.Lucene.Index.Web.config", root + "Sitecore.Marketing.Definitions.MarketingAssets.Repositories.Lucene.IndexConfiguration.config", root + "Sitecore.Speak.ContentSearch.Lucene.config", root + "Sitecore.Marketing.Definitions.MarketingAssets.Repositories.Lucene.Index.Web.config", root + "Sitecore.Marketing.Definitions.MarketingAssets.Repositories. Lucene.IndexConfiguration.config", root + "Sitecore.Speak.ContentSearch.Lucene.config", root + "Sitecore.ContentSearch.Lucene.DefaultIndexConfiguration.Xdb.config" ]; var fxmFiles = [ fxmRoot + "Sitecore.FXM.Lucene.DomainsSearch.DefaultIndexConfiguration.config", fxmRoot + "Sitecore.FXM.Lucene.DomainsSearch.Index.Master.config", fxmRoot + "Sitecore.FXM.Lucene.DomainsSearch.Index.Web.config", ]; var listManFiles = [ listManagementRoot + "Sitecore.ListManagement.Lucene.Index.List.config", listManagementRoot + "Sitecore.ListManagement.Lucene.IndexConfiguration.config", ]; var socialsFiles = [ socialRoot + "Sitecore.Social.Lucene.Index.Master.config", socialRoot + "Sitecore.Social.Lucene.Index.Web.config", socialRoot + "Sitecore.Social.Lucene.IndexConfiguration.config", socialRoot + "Sitecore.Social.Lucene.Index.Analytics.Facebook.config" ]; var testingFiles = [ testingRoot + "Sitecore.ContentTesting.Lucene.IndexConfiguration.config", ]; return Promise.all([ new Promise(function (resolve, reject) { gulp.src(roots).pipe(rename(function (path) { path.extname = ".config.disabled"; })).pipe(gulp.dest(root)); gulp.src(fxmFiles).pipe(rename(function (path) { path.extname = ".config.disabled"; })).pipe(gulp.dest(fxmRoot)); gulp.src(listManFiles) .pipe(rename(function (path) { path.extname = ".config.disabled"; })).pipe(gulp.dest(listManagementRoot)); gulp.src(socialsFiles).pipe(rename(function (path) { path.extname = ".config.disabled"; })).pipe(gulp.dest(socialRoot)); gulp.src(testingFiles).pipe(rename(function (path) { path.extname = ".config.disabled"; })) .pipe(gulp.dest(testingRoot)); }), new Promise(function (resolve, reject) { del(roots, { force: true }); del(fxmFiles, { force: true }); del(listManFiles, { force: true }); del(socialsFiles, { force: true }); del(testingFiles, { force: true }); }) ]).then(function () { // Other actions del(roots, { force: true }); del(fxmFiles, { force: true }); del(listManFiles, { force: true }); del(socialsFiles, { force: true }); del(testingFiles, { force: true }); }); });
In order to automate the renaming of all the Azure config files I wrote the following Gulp task:
gulp.task('Z-Search-Enable-Azure-Configs', function () { var root = config.websiteRoot + "/App_Config/Include/"; var socialRoot = config.websiteRoot + "/App_Config/Include/social/"; var listManagementRoot = config.websiteRoot + "/App_Config/Include/ListManagement/"; var fxmRoot = config.websiteRoot + "/App_Config/Include/FXM/"; var testingRoot = config.websiteRoot + "/App_Config/Include/ContentTesting/"; // Main root config folder var roots = [root + "Sitecore.ContentSearch.Azure.DefaultIndexConfiguration.config.disabled", root + "Sitecore.ContentSearch.Azure.Index.Analytics.config.disabled", root + "Sitecore.ContentSearch.Azure.Index.Core.config.disabled", root + "Sitecore.ContentSearch.Azure.Index.Master.config.disabled", root + "Sitecore.ContentSearch.Azure.Index.Web.config.disabled", root + "Sitecore.Marketing.Azure.Index.Master.config.disabled", root + "Sitecore.Marketing.Azure.Index.Web.config.disabled", root + "Sitecore.Marketing.Azure.IndexConfiguration.config.disabled", root + "Sitecore.Marketing.Definitions.MarketingAssets.Repositories.Azure.Index.Master.config.disabled", root + "Sitecore.Marketing.Definitions.MarketingAssets.Repositories.Azure.Index.Web.config.disabled", root + "Sitecore.Marketing.Definitions.MarketingAssets.Repositories.Azure.IndexConfiguration.config.disabled" ]; gulp.src(roots) .pipe(rename(function (path) { path.extname = ""; path.basename = path.basename.replace(".disabled"); })).pipe(gulp.dest(root)); // Testing files var testingFiles = [ testingRoot + "Sitecore.ContentTesting.Azure.IndexConfiguration.config.disabled", ]; gulp.src(testingFiles).pipe(rename(function (path) { path.extname = ""; path.basename = path.basename.replace(".disabled"); })) .pipe(gulp.dest(testingRoot)); //del(testingFiles, { force: true }); // FXM files var fxmFiles = [ fxmRoot + "Sitecore.FXM.Azure.DomainsSearch.DefaultIndexConfiguration.config.disabled", fxmRoot + "Sitecore.FXM.Azure.DomainsSearch.Index.Master.config.disabled", fxmRoot + "Sitecore.FXM.Azure.DomainsSearch.Index.Web.config.disabled", ]; gulp.src(fxmFiles) .pipe(rename(function (path) { path.extname = ""; path.basename = path.basename.replace(".disabled"); })).pipe(gulp.dest(fxmRoot)); var listManFiles = [ listManagementRoot + "Sitecore.ListManagement.Azure.Index.List.config.disabled", listManagementRoot + "Sitecore.ListManagement.Azure.IndexConfiguration.config.disabled", ]; gulp.src(listManFiles) .pipe(rename(function (path) { path.extname = ""; path.basename = path.basename.replace(".disabled"); })).pipe(gulp.dest(listManagementRoot)); var socialsFiles = [ socialRoot + "Sitecore.Social.Azure.Index.Master.config.disabled", socialRoot + "Sitecore.Social.Azure.Index.Web.config.disabled", socialRoot + "Sitecore.Social.Azure.IndexConfiguration.config.disabled" ]; gulp.src(socialsFiles).pipe(rename(function (path) { path.extname = ""; path.basename = path.basename.replace(".disabled"); })).pipe(gulp.dest(socialRoot)); });
I hope this saves you and your team some time when switching over to Azure Search on your Sitecore Helix project. Please leave us some comments if you have some more tips along these lines.
Good work Tom
LikeLike