Improve your user experience with the Apache Solr search engine for your WordPress website.
Search is critical for your site, but the default search for WordPress leaves a lot to be desired. Improve your user experience with the Apache Solr search engine for your WordPress website.
solr_integrate
parameter set to true.This plugin is under active development on GitHub:
https://github.com/pantheon-systems/solr-power
Please feel free to file issues there. Pull requests are also welcome! See CONTRIBUTING.md for information on contributing.
For further documentation, such as available filters and working with the SolrPower_Api
class directly, please see the project wiki:
https://github.com/pantheon-systems/solr-power/wiki
You may notice there are two sets of tests running, on two different services:
Both of these test suites can be run locally, with a varying amount of setup.
PHPUnit requires the WordPress PHPUnit test suite, and access to a database with name wordpress_test
. If you haven’t already configured the test suite locally, you can run bash bin/install-wp-tests.sh wordpress_test root '' localhost
. You’ll also need access to a running Solr instance, in order to run the unit tests against Solr.
Behat requires a Pantheon site with Solr enabled. Once you’ve created the site, you’ll need install Terminus, and set the TERMINUS_TOKEN
, TERMINUS_SITE
, and TERMINUS_ENV
environment variables. Then, you can run ./bin/behat-prepare.sh
to prepare the site for the test suite.
Note that dependencies are installed via Composer and the vendor
directory is not committed to the repository. You will need to run composer install
locally for the plugin to function. You can read more about Composer here
This plugin has WP-CLI support.
All Solr Power related commands are grouped into the wp solr
command, see an example:
$ wp solr usage: wp solr check-server-settings or: wp solr delete [<id>...] [--all] or: wp solr index [--batch=<batch>] [--batch_size=<size>] [--post_type=<post-type>] or: wp solr info [--field=<field>] [--format=<format>] or: wp solr optimize-index or: wp solr repost-schema or: wp solr stats [--field=<field>] [--format=<format>] See 'wp help solr <command>' for more information on a specific command.
You can see more details about the commands using wp help solr
:
**NAME** wp solr **DESCRIPTION** Perform a variety of actions against your Solr instance. **SYNOPSIS** wp solr <command> **SUBCOMMANDS** check-server-settings Check server settings. delete Remove one or more posts from the index. index Index all posts for a site. info Report information about Solr Power configuration. optimize-index Optimize the Solr index. repost-schema Repost schema.xml to Solr. stats Report stats about indexed content.<h3>WP_Query Integration</h3>
Use Solr in a custom WP_Query instead of querying a database. Add 'solr_integrate' => true
to the query arguments.
NOTE: Currently, only basic queries, tax_query, meta_query and date_query are supported. See examples/example.custom_WP_Query.php
for an example.
A meta_query can use the following compare operators:
'='
'!='
'>'
'>='
'<'
'<='
'LIKE'
'NOT LIKE'
'IN'
'NOT IN'
'BETWEEN'
'NOT BETWEEN'
'EXISTS'
'NOT EXISTS'
('REGEXP'
, 'NOT REGEXP'
, and 'RLIKE'
are not supported.)
To support searching by author name (e.g. where “Pantheon” would return posts authored by the “Pantheon” user), add the following to your custom schema.xml
:
<copyField source="post_author" dest="text"/>
The following guidance can be used to extend the Solr index and modify boosts beyond just this example.
To support math functions on dates, you must add a custom schema.xml
to Solr and reindex with the new schema.
Add the following to schema.xml
:
<!-- Add to <types> --> <!-- See: https://lucene.apache.org/solr/6_2_0/solr-core/org/apache/solr/schema/TrieDateField.html --> <fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/> <!-- Add to <fields> --> <field name="post_date_iso" type="tdate" indexed="true" stored="true" required="true" />
Add the following to your functions.php
file.
<?php /** * Hooks into the document build process to add post date field in proper format. */ function my_solr_build_document( $doc, $post_info ) { $post_time = strtotime( $post_info->post_date ); // Matches format required for TrieDateField $doc->setField( 'post_date_iso', gmdate( 'c\Z', $post_time ) ); return $doc; } add_filter( 'solr_build_document', 'my_solr_build_document', 10, 2 ); /** * Hooks into query processor, Dismax, to add publish date boost. * See: https://www.metaltoad.com/blog/date-boosting-solr-drupal-search-results */ function my_solr_dismax_query( $dismax ) { $dismax->setQueryParser( 'edismax' ); $dismax->setBoostQuery( 'recip(abs(ms(NOW/HOUR,post_date_iso),3.16e-11,1,1))' ); return $dismax; } add_filter( 'solr_dismax_query', 'my_solr_dismax_query' );
post_date_iso
field.”solr_build_document
filter, you will get a similar error.post_date_iso
field is missing from the index, Solr will ignore this boost and return regular results.Once solr has sent the data to the solr server, solr must COMMIT the data to the index and adjust the index and relevancy ratings accordingly before that data can appear in search results.
By default, Solr Search for WordPress has auto-commit disabled. The index is committed when the uncommitted item is two minutes old, or the cron runs. By default, the cron runs on the Pantheon platform every hour.
When autocommit is enabled, Solr Search for WordPress commits data when it sends every post. When running on Pantheon, we recommend leaving autocommit disabled to aid overall site performance.
To enable autocommit, add the following to wp-config.php
or an mu-plugin.
define( 'SOLRPOWER_DISABLE_AUTOCOMMIT', false );
To force-commit data outside of a normal cron run, from the command line, you can run the command below or simply force a cron-run.
wp solr commit
The Solr Power plugin can be installed just like you’d install any other WordPress plugin.
Because Solr Power is intended to be a bridge between WordPress and the Apache Solr search engine, you’ll need access to a functioning Solr 3.6 instance for the plugin to work as expected. This plugin does not support other versions of Solr. The plugin also requires PHP 7.1 or higher.
If you’re using the Solr Power plugin on Pantheon, setting up Apache Solr is as easy as enabling the Apache Solr add-on in your Pantheon dashboard. Once you’ve done so:
If you’re using the Solr Power plugin elsewhere, you’ll need to install and configure Apache Solr. On a Linux environment, this involves four steps:
./bin/install-solr.sh
to install and run Apache Solr on port 8983.PANTHEON_INDEX_HOST
and PANTHEON_INDEX_PORT
environment variables.schema.xml
to the Solr configuration directory (a path similar to solr/conf/schema.xml
).Alternatively, there are a couple of community-maintained Docker containers you may be able to use: kalabox/pantheon-solr, kshaner/solr.
In a local development environment, you can point Solr Power to a custom Solr instance by creating a MU plugin with:
<?php /** * Define Solr host IP, port, scheme and path * Update these as necessary if your configuration differs */ putenv( 'PANTHEON_INDEX_HOST=192.168.50.4' ); putenv( 'PANTHEON_INDEX_PORT=8983' ); add_filter( 'solr_scheme', function(){ return 'http'; }); define( 'SOLR_PATH', '/solr/wordpress/' );
** Note for Lando users **
If you are using lando for development, the MU plugin is not needed. Lando auto configures everything for your local environment to connect to the docker index it maintains and if you overrite the ENV variables it will mess with that configuration.
Please report security bugs found in the source code of the Solr Power plugin through the Patchstack Vulnerability Disclosure Program. The Patchstack team will assist you with verification, CVE assignment, and notify the developers of this plugin.
readme.txt
[#562]$post->score
value to parsed search results [#559]'fields' => 'id=>parent'
[#528].posts_pre_query()
return values based on ‘fields’ argument [#522].array_map( 'get_post' )
in posts_pre_query
[#521].class-solrpower-options.php
[#513].wp_strip_all_tags()
to remove style and script tag content [#500].SOLRPOWER_DISABLE_QUERY_ALT
constant for disabling setQueryAlternative behavior [#495].$_ENV['FILEMOUNT']
when indicating path for schema.xml
[#492].posts_pre_query
hook to support use of ‘fields’ in WP_Query
[#448].solr_power_ajax_search_query_args
filter to modify AJAX search query arguments [#432].solr_is_private_blog
filter to allow control over whether a blog is indexed [#423].composer
magic to unblock WordPress.org plugin updates [#418].solr_index_stat
filter for allowing additional information to be included [#396].solr_facet_operator
filter for allowing facet operator to be overridden [#388].<h1>
tags in Solr error response, in addition to <title>
[#407].$post->post_author
remains user ID when processing WP_Querypost_title
and post_content
are not bolded4.1.0
and other dependencies updates as needed7.1
7.1
post__in
and post__not_in
.batch_size
argument for wp solr index
test_wp_query_failed_ping
to avoid racy failures$search->getData()
failsadmin.php
in network adminphpcs
can easily be runphpcs
can easily be runorderby=>meta_value_num
[#299].$_SERVER['HOME']
as a reliable way of finding the cert on Pantheon [#314]..distignore
file for wp dist-archive solr-powersolr_allow_admin
filterPANTHEON_ENVIRONMENT
isn’t setschema.xml
and supported Solr version in READMEpost_title
more than post_content
with sane boost valuesWP_Query
wp solr index
to provide more verbositypaged
to an optionwp solr index
codesolr_power_index_all_finished
action when indexing is completesolr_allow_admin
and solr_allow_ajax
filterssolr_boost_query
filter for boosted itemssolr_dismax_query
filter for Dismaxget_post_types
and get_post_statuses
helper methodsget_env
callsolr_post_status
filtersolr_post_types
filter to get_post_types
callPANTHEON_INDEX_PORT
instead of hard-coded port in curls
parameter for WP_Query when Solr is enabledsolr_power_index_all_finished
action when indexing all posts is completePANTHEON_INDEX_HOST
or PANTHEON_INDEX_PORT
environment variables are not set. Instead, show an admin notice to the user advising them to configure the environment variables.