Documentation

Client Configuration for a Stand-Alone Solr Server

Once you have a stand-alone Solr server configured, you need to change the way that Broadleaf attempts to communicate with Solr. First, you need to navigate to site/src/main/webapp/WEB-INF/applicationContext.xml. In place of the following XML snippet:

<bean id="blSearchService" class="org.broadleafcommerce.core.search.service.solr.SolrSearchServiceImpl">
    <constructor-arg name="solrServer" ref="${solr.source.primary}" />
    <constructor-arg name="reindexServer" ref="${solr.source.reindex}" />
    <constructor-arg name="adminServer" ref="${solr.source.admin}" />
</bean> 

Add the following XML:

<bean id="solrServer" class="org.apache.solr.client.solrj.impl.LBHttpSolrServer">
        <constructor-arg value="${solr.url.primary}"/>
</bean>
<bean id="solrReindexServer" class="org.apache.solr.client.solrj.impl.LBHttpSolrServer">
        <constructor-arg value="${solr.url.reindex}"/>
</bean>
<bean id="solrAdminServer" class="org.apache.solr.client.solrj.impl.LBHttpSolrServer">
        <constructor-arg value="${solr.url.admin}"/>
</bean>
<bean id="blSearchService" class="org.broadleafcommerce.core.search.service.solr.SolrSearchServiceImpl">
    <constructor-arg name="solrServer" ref="${solr.source.primary}" />
    <constructor-arg name="reindexServer" ref="${solr.source.reindex}" />
    <constructor-arg name="adminServer" ref="${solr.source.admin}" />
</bean> 

See the site/src/main/resources/runtime-properties/common.properties. Comment out the lines that use solrEmbedded as the value for the various Solr sources. Add the additional lines that assing solrServer, solrReindexServer, and solrAdminServer as the respective values for the solr.source.* property names. These values will get replaced in the XML above, using property substitution.

#solr.source.primary=solrEmbedded
#solr.source.reindex=solrEmbedded
#solr.source.admin=solrEmbedded

# Comment out the solr.source.* above and use the following 
# if using non-embedded Solr
solr.source.primary=solrServer
solr.source.reindex=solrReindexServer
solr.source.admin=solrAdminServer

Next, for each relevant environment-specific properties file (e.g. site/src/main/resources/runtime-properties/development.properties) add the following:

solr.url.primary=http://localhost:8983/solr/primary
solr.url.reindex=http://localhost:8983/solr/reindex
solr.url.admin=http://localhost:8983/solr

Again, property substitution will be used to replace the solr.url.* properties with the correct values. These values can be different in each environment. For example, if you change site/src/main/resources/runtime-properties/production.properties, then the production URLs will be used in that environment. For example:

solr.url.primary=http://solr.prod:8983/solr/primary
solr.url.reindex=http://solr.prod:8983/solr/reindex
solr.url.admin=http://solr.prod:8983/solr

Alternatively, if you are using a Master / Slave configuration, or multiple Solr nodes, you can use a comma-delimited list of Solr servers. The instance of the client that you are using is org.apache.solr.client.solrj.impl.LBHttpSolrServer which is a load balanced wrapper around org.apache.solr.client.solrj.impl.HttpSolrServer. For example:

solr.url.primary=http://slave1:8983/solr/primary,http://slave2:8983/solr/primary
solr.url.reindex=http://master:8983/solr/reindex
solr.url.admin=http://master:8983/solr

Broadleaf will now happily connect to your Stand-Alone Solr Server(s).