I recently found myself with the challenge of migrating a Sitecore 7 system from Lucene to Solr. Several custom Lucene indexes were used for rendering critical UI elements. Periodic issues with Lucene indexes becoming corrupted became problematic. The site had outgrown Lucene, so a transition to Solr was needed, and sooner rather than later.
I’m a newbie to Solr, and found this a bit challenging, so I thought I’d write about it in case there is someone else out there on an older version of Sitecore, facing this same situation.
Which Version of Solr
I started by trying to determine which version of Solr to run. I consulted the Sitecore Solr Compatibility Table. I wanted the most current version of Solr that I could find that would result in the fewest compatibility issues with the old version of Sitecore. After reading Dan Solovay’s excellent blog post, I decided to use Solr v5.x, specifically v5.4.1-0.
How to Install Solr
I wanted to spin Solr up quickly and simply. Bitnami seemed like an easy way to install the Apache Web Server and Solr. Søren Engel wrote a great blog about using Bitnami to setup Solr with Sitecore 8. I hunted around on the internet and managed to find a link to the older version of the installer. Installing Apache Web Server and Solr using Bitnami is very easy.
Generating the Schema File
Next, I downloaded the Solr Support Package from the Sitecore SDN and installed it using the Sitecore Installation Wizard. This tool attempts to modify the Solr Schema configuration so that you can use Solr with Sitecore. Running the tool is easy, but it is out of date if you are using a newer version of Solr.
I found the Solr schema file in the “D:\Bitnami\solr-5.4.1-0\apache-solr\solr\configsets\basic_configs\conf” folder. The file needs to be modified before running the Sitecore Solr Schema configuration tool. Enclose all and elements with a tag. Also enclose all elements with a tag.
Next, open the Sitecore Control Panel and run “Generate the Solr Schema.xml file” from the Indexing menu. Open the output file, and make the following edits:
- should be
- Add to the section.
This is the schema file that we will use for the Solr cores.
Creating Solr Cores
Similar to the issues that Dan Solovay described in his blog, I was unable to create a Solr core using Sitecore’s Search Scaling Guide. I created a core as follows:
- Create a folder in the Solr folder (D:\Bitnami\solr-5.4.1-0\apache-solr\solr) and name it with the intended core name.
- Copied D:\Bitnami\solr-5.4.1-0\apache-solr\solr\configsets\basic_configs\conf folder to D:\Bitnami\solr-5.4.1-0\apache-solr\solr.
- Replace the schema.xml found in the conf folder with the Sitecore Schema file.
- Create a file name “core.properties” in the folder created in step 1 and add the following to the file:
- Create a folder named “data” and a folder named “lib” in the folder created in Step 1.
- Stop and restart Solr using the Bitnami Apache Solr Stack Manager Tool found in the Windows Start menu.
- Check the Core Admin page in Solr to make sure that the core loaded successfully.
You will need to create a core for each custom index that your Sitecore implementation uses.
Changing Sitecore from Lucene to Solr
Now that Solr is running, lets switch Sitecore from Lucene to Solr.
In the Sitecore App_Config folder, disable the Lucene configuration files. I renamed:
Sitecore.ContentSearch.Lucene.DefaultIndexConfiguration.config to Sitecore.ContentSearch.Lucene. DefaultIndexConfiguration.config.disable
Sitecore.ContentSearch.Lucene.Index.Master.config to Sitecore.ContentSearch.Lucene.Index.Master.config.disable
Sitecore.ContentSearch.Lucene.Index.Core.config to Sitecore.ContentSearch.Lucene.Index.Core.config.disable
Sitecore.ContentSearch.Lucene.Index.Web.config to Sitecore.ContentSearch.Lucene.Index.Web.config.disable
Add the Sitecore.ContetnSearch.Solr.Indexes.config from the Solr Support package.
Defining Solr Service Base Address
In the Sitecore.ContentSearch.Solr.Indexes.config, change the Solr address to your Apache Solr stack.
I needed to move this setting to the web.config file so that it was accessible from the web.config transform I run in the deployment process. I also needed to bump up the Solr results limit in this file:
The default is 500, which would not work for this site.
I elected to use Castle Windsor, since I am already using Glass Mapper. Make sure that the following dlls are in the bin folder:
You may have to use nuget to install Castle Windsor. I didn’t need to do this since I already had Glass Mapper set up.
In Global.asax, change:
<%@Application Language='C#' Inherits="Sitecore.Web.Application" %>
<%@Application Language='C#' Inherits="Sitecore.ContentSearch.SolrProvider.CastleWindsorIntegration.WindsorApplication" %>
Custom Index Configurations
I created a custom configuration for each index. I filtered unwanted content out by using Include Template filtering.
I also defined the fields that I needed in the index in the fieldNames and IncludeField sections.
Custom Computed Fields go in .
Custom Index Definition
I added the custom index definitions that I needed to the web.config file in configuration/sitecore/contentSearch/configuration. I add my custom indexes in the web.config file because I alter the web.config file based on a web.config transform that runs in the deployment process. Some indexes get removed depending on the server.
That’s it. I really had very few code changes to make and they were largely due to some irregularity in the content in the existing Lucene indexes. I was surprised at how easy the migration was from this perspective, considering the large number of custom indexes that were defined. All of my computed fields and index references worked with no changes needed.
One thought on “Migrating Sitecore 7 Custom Indexes from Lucene to Solr”
@BptPokerGuy , Thanks for the blog. This is really helpful and precise.
Following ur approach I recently migrated all my out of the box lucene search indexes to Solr (5.1). Had two questions –
(I) Since I am using Sitecore 8.2 initial release, by default it comes with out of the box dependency injection. Do I still have to configure SOLR with a specific IOC container or can I just leave it as it is?
(II) I already have custom lucene index configuration and definition. For switching them to SOLR, do I have to redo all custom configuration for SOLR using SOLR provider? Is there any other better alternative available to us?