Solr Search Engine Bundle is bundled by default in eZ Platform and these instructions are for configuring it, for eZ Publish Platform 5.4 instructions see Solr Search Engine Bundle.
Version 1.0.x of Solr Bundle primarily aims to be used as replacement for Legacy (SQL-based) search engine for better scalability and performance (especially with field criteria and sort clauses). And while it also provides better full text search thanks to Solr, more advance search features like Faceting will come in later releases.
What is Solr Search Engine Bundle?
ezplatform-solr-search-engine as the package is called, aims to be a transparent drop in replacement for the SQL based "Legacy" search engine powering Search API by default. By enabling Solr and re-indexing your content, all your exising Search queries using SearchService, will be powered by Solr automatically. This allows you to scale up your eZ Platform installation and be able to continue development locally against SQL engine, and have test infrastructure, Staging and Prod powered by Solr. Thus remove considerable load from your database so it can focus on more important things, like publishing .
Se Architecture page for further information on the architecture of eZ Platform.
How to set up Solr Search engine
Step 1: Enabling the Bundle
Not needed with eZ Platform
This step is not needed for eZ Platform as of 15.09, however it is kept here for reference in case you have previously disabled the bundle.
Add/Update composer dependencies:
command line- Activate EzPublishSolrSearchEngineBundle by adding the following lines to your
app/AppKernel.php
file: newEzSystems\EzPlatformSolrSearchEngineBundle\EzSystemsEzPlatformSolrSearchEngineBundle()
Step 2: Configuring & Starting Solr
First, download and extract Solr, we currently support Solr 4.10.4:
Secondly, copy configuration files needed for eZ Solr Search Engine bundle, here from the root of your project to the place you extracted Solr:
Thirdly, Solr Bundle does not commit solr index changes directly on repository updates, leaving it up to you to tune this using solrconfig.xml
as best practice suggests, example config:
Step 3: Configuring bundle
The Solr search engine bundle can be configured many ways, here are some examples:
Single Core example (default)
Out of the box in eZ Platform the following is enabled for simple setup:
Shared Core example
In the following example we have decided to separate one language as the installation contains several similar languages, and one very different language that should be receive proper language analysis for proper stemming and sorting behavior by Solr:
Multi Core example
If full language analysis features are preferred, then each language can be configured to separate cores.
Note: Please make sure to test this setup against single core as it might perform worse then single core if your project uses a lot for language fallbacks per siteaccess as queries will then be performed across several cores at once.
Step 4: Configuring repository with the specific search engine
The following is an example of configuring Solr Search Engine, where connection
name is same as in example above, and engine is set to solr
:
Step 5: Run CLI indexing command
Make sure to configure your setup for indexing
Some exceptions might happen on indexing if you have not configured your setup correctly, here are the most common issues you may encounter:
- Exception if Binary files in database have an invalid path prefix
- Make sure
ezplatform.yml
configurationvar_dir
is configured properly. - If your database is inconsistent in regards to file paths, try to update entries to be correct (but make sure to make a backup first).
- Make sure
- Exception on unsupported Field Types
- Make sure to implement all Field Types in your installation, or to configure missing ones as NullType if implementation is not needed.
- Content not immediately available
- Solr Bundle is on purpose not committing changes directly on Repository updates (on indexing), but letting you control this using Solr configuration. Adjust Solr autoSoftCommit visibility of change to search index) and/or autoCommit (hard commit, for durability and replication) to balance performance and load on your Solr instance against needs you have for "NRT".
- Running out of memory during indexing
- In general make sure to run indexing using prod environment to avoid debuggers and loggers from filing up memory.
- Stash: Disable in_memory cache as recommended on Persistence cache for long running scripts.
- Flysystem: An open issue exists where you can find further info https://jira.ez.no/browse/EZP-25325
Last step is to execute initial indexation of data:
Providing feedback
After completing the installation you are now free to use your site as usual. If you get any exceptions for missing features, have feedback on performance, or want to discuss, join our community slack channel at https://ezcommunity.slack.com/messages/ezplatform-use/
2 Comments
Edi Modrić
Two questions (I think they could be useful to general population, that's why I'm asking them here, so answers could be easily found):
1) Is there a way to add some fields to index on document level, instead of field level?
2) How to use CustomField in field type indexing handler? I get the error message:
[eZ\Publish\API\Repository\Exceptions\NotImplementedException]
Intentionally not implemented: No mapper available for: eZ\Publish\SPI\Search\FieldType\CustomField
Petar Spanja
1) ATM only by implementing your own document mapper. We should probably provide an extension point here so afaik it is on the roadmap, as the case is common enough and the same is already possible to do with eZ Find.
2) Yes, the mapper for custom field is not implemented. We'll look into if having the default implementation there makes sense. For custom field you would typically dispatch the mapping by object type (CustomField) and the $type property.