5.4.X >= 5.4.5
Support for Solr Search Engine Bundle when used in eZ Publish 5.4 with legacy is limited, as the legacy integration is done by Netgen's ezplatformsearch, a third party community-supported extension.
For instructions on the bundle for eZ Platform, see Solr Search Engine Bundle in the eZ Platform Developer documentation.
Version 1.0.x of Solr Bundle primarily aims to be drop in replacement for Legacy (SQL based) search engine for better scalability and performance (mainly with field criteria and sort clauses). And while it also provides better full text search thanks to Solr, more advance search features like Faceting, Spellchecking, plugin system, .. will come in later releases, most for for newer versions of eZ Platform only. See 5.4.5 Release Notes for further info.
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 Publish 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 Publish Platform and eZ Platform.
How to setup Solr Search engine
Step 1: Enabling Bundle
In this step you'll enable the Solr Search Engine Bundle which handles indexing on all updates to Platform stack API, and to handle all search queries going to Search Service.
- command line
Activate
EzPublishSolrSearchEngineBundle
by adding the following lines to yourezpublish/EzPublishKernel.php
file:new EzSystems\EzPlatformSolrSearchEngineBundle\EzSystemsEzPlatformSolrSearchEngineBundle()
Step 2: Enabling Legacy extension
Being on 5.x, you'll need to also make sure searches in legacy (like in admin interface) is using the new solr search engine, this functionality is provided by ezplatformsearch extension made by NetGen.
Add/Update composer dependencies:
command lineActivate extension in
site.ini
, typicallyezpublish_legacy/settings/override/site.ini.append.php
site.ini
Step 3: 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 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 4: 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 install contains several similar languages, and one very different language that should be recive 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 5: 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 be solr
:
Config in 5.4.5 and eZ Platform
In eZ Publish 5.4.5 when installed via composer create-project, the example above is in default config with one small difference (same as on eZ Platform). There search.engine
is set to %search_engine%
, which is a parameter that needs to be set in parameters.yml, and for use with Solr it will needs to be set to "solr"
as described in parameters.yml.dist, and as described above.
Step 6: Clear prod cache
While Symfony dev environment keeps track of changes to yml files, prod does not, so to make sure Symfony reads the new config we clear cache:
Step 7: Run CLI indexing command
Last step is to execute initial indexation of data:
Known issues
If you have issues using the indexing command there are some known issues and how you resolve them listed in the 5.4.5 Release Notes.
Providing feedback
After completing the installation you are now free to use your site as usual. If you get any excpetions for missing features, have feedback on performance, or want to discuss, join our community slack channel at https://ezcommunity.slack.com/messages/ezplatform-use/
13 Comments
Harald Tollefsen
Fantastic!
EDIT: Will this be available in 5.4.3/next eZ Publish release?
Bertrand Dunogier
Yes, we plan on making it compatible with
5.4.45.4.5, possibly via a beta release before the real one. And it will be part of eZ Platform 1.0.Edi Modrić
Is there a specific reason why location full text search criterion is disabled in Solr bundle?
https://github.com/ezsystems/ezplatform-solr-search-engine/blob/master/lib/eZ/Publish/Core/settings/search_engines/solr/criterion_visitors.yml#L377-L383
André Rømcke
I'll have to double check with Petar, but we decided to disable it by default if it would result in more then doubling(content + number of locations) of fulltext index.
If that is valid (more then doubling of index) then we will document how to enable it, otherwise it is something we will fix in upcoming releases.
Edi Modrić
Okay thanks!
Two more 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
Regarding full text Location search, we disabled it because of both index size and skewing of statistics by having Content field indexed per Location.
Now we changed the approach there and Locations are indexed as sub documents of Content without full text field, then we can use block join to target parent full text field and get the score of the parent. So basically we are going for that, hopefully it will materialize soon.
Petar Spanja
1) ATM only by implementing your own document mapper. I recognize that we should probably provide an extension point here, 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.
André Rømcke
For reference, Full text search support for Location Search was added on September 22 and is part of version 1.0.0: https://github.com/ezsystems/ezplatform-solr-search-engine/pull/18
It reuses the full text index for the content so no duplication of the index size is needed.
Miro Kresonja
After going through all these steps, I'm getting the following message during indexing:
[Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException]
You have requested a non-existent service "ez_search_engine_solr.connection.default.gateway_id".
Is this the kind of a thing that should go in here, or in slack? How do I join the slack group?
Sarah Haïm-Lubczanski
Miro Kresonja Yes, you can ask your questions on Slack. To join Slack channels, use the "ask your invitation" link on the Share website :
http://share.ez.no/get-involved/exchange#slack
Valentin Nivuahc
If you have some memory issues during the indexing, check this post : How to run long-running console commands.
Björn Dieding@xrow.de
The is a typo in the doc. It shall read:
php app/console cache:clear --env=prod
André Rømcke
Thanks Björn Dieding@xrow.de,
fixed the use of "app" to "ezpublish" as is the case with 5.x, and also the command "cache:clear".
The order of --env however is on purpose, it's a global argument to Symfony console.