Install + Configure Elasticsearch to Speed up WordPress CentOS

Share This:
WordPress ElasticSearch

The default WordPress search uses MySQL which is not search-optimized and can be slow due to the structure of some WordPress and WooCommerce tables. Elasticsearch is a NoSQL database that uses a Lucene structure with the goal of providing search results in real-time. The ElasticPress plugin integrates WordPress with Elasticsearch to make WordPress searching awesomely fast. ElasticPress extends WordPress search capability by including meta, taxonomy, and author searches. I saw the WordCamp talk by Taylor from 10up and was hooked.

WordPress.com uses Elasticsearch extensively, so you can get a similar search power by self-hosting Elasticsearch since it is free, open-source, and hosted on GitHub.

This tutorial will show you how to install and configure Elasticsearch for WordPress on your VPS like Digital Ocean or Dedicated server running CentOS. If you don’t want to host your own Elasticsearch then you can pay Elastic to host it for you.

This diagram shows how WordPress search normally works. Somebody has a query and the PHP handler goes into MySQL to search for keywords. If you have a large number of posts or pages then you have likely experienced this as slow.

WordPress Regular Search
EllasticSearch WordPress

Install + Configure Elasticsearch to Speed up WordPress CentOS

Installation overview

  • Install Elasticsearch on CentOS
  • Configure the ElasticPress plugin

Install Elasticsearch

Install Java

yum install java-*-openjdk-headless.x86_64 -y

Create the Elasticsearch repository

sudo nano /etc/yum.repos.d/elasticsearch.repo

Paste this which includes the repository and key.

[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=https://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

This will install Elasticsearch on CentOS

sudo yum install elasticsearch

Enable the Elasticsearch service so it autostarts on boot, then start it

systemctl enable elasticsearch
service elasticsearch start

Configure Elasticsearch for WordPress

Back up the default Elasticsearch configuration

sudo mv /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak

Create a fresh Elasticsearch configuration for WordPress.

sudo nano /etc/elasticsearch/elasticsearch.yml

This is a simple Elasticsearch configuration for a single node cluster that listens on the loopback interface for security.

If you are using Elasticsearch on a separate server I’d recommend using nginx as a reverse proxy for SSL so your post data is encrypted.

cluster.name: wordpress
node.name: wpbullet
network.host: 127.0.0.1
http.port: 9200
node.max_local_storage_nodes: 1

Restart the Elasticsearch service to enable the configuration

sudo service elasticsearch restart

Let’s make sure Elasticsearch is running on the loopback interface (127.0.0.1), note that it can take up to 10 seconds or so for the Elasticsearch daemon to fully start up.

sudo netstat -lntp

You should see a java program (Elasticsearch) listening on port 9200

tcp        0      0 127.0.0.1:9200          :::*                    LISTEN      10216/java
tcp        0      0 127.0.0.1:9300          :::*                    LISTEN      10216/java
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      10216/java
tcp6       0      0 127.0.0.1:9300          :::*                    LISTEN      10216/java

Let’s make sure Elasticsearch is using the configuration we just made

curl -X GET http://localhost:9200/

You’ll see this output showing the name of the node and the cluster name.

{
  "name" : "wordpress",
  "cluster_name" : "wpbullet",
  "version" : {
    "number" : "2.3.3",
    "build_hash" : "218bdf10790eef486ff2c41a3df5cfa32dadcfde",
    "build_timestamp" : "2016-05-17T15:40:04Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.0"
  },
  "tagline" : "You Know, for Search"
}

Configure WordPress to use ElasticSearch

Disable any object caching like memcached or Redis – you could get php loops which crash your server!

My forked version of Memcached is your friend will not cause any php loops (source).

To enable Elasticsearch for WordPress, install ElasticPress (hosted on github) made by 10up.

ElastiPress Banner

After enabling ElasticPress you can create the Elasticsearch index by going to the ElasticPress and clicking the Gear icon.

Set the Elasticsearch Host to http://127.0.0.1:9200 and click Save Changes.

ElasticPress WordPress Search Set Host

Click ElasticPress in the Admin sidebar again to see the Elasticsearch integration options.

I recommend Activating Search and Admin.

The Related posts will add a small widget at the bottom of your posts.

ElasticPress WordPress Search

To start the Elasticsearch index process click the Refresh icon in the top right.

If you get any timeouts or errors when running the index then use WP-CLI instead, you can install WP-CLI easily

sudo wget -q https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar -O /usr/bin/wp
sudo chmod 755 /usr/bin/wp

Then enter your WooCommerce installation folder

cd /var/www/wp-bullet

You can define the ElasticPress Elasticsearch host in wp-config.php

// ElasticPress Host
define( 'EP_HOST', 'http://127.0.0.1:9200' );

Use this command to create the WooCommerce Elasticsearch index.

wp elasticpress index --setup --allow-root

On a DigitalOcean VPS it took about 10 minutes for ElasticPress to index 78000 posts.

Processed 77000/78364 entries. . .
Processed 77350/78364 entries. . .
Processed 77700/78364 entries. . .
Processed 78050/78364 entries. . .
Processed 78364/78364 entries. . .
Number of posts indexed on site 1: 78364
Total time elapsed: 756.411
Warning: ElasticPress is already activated.
Success: Done!

After you run the initial index, Elasticsearch will be updated automatically when you make changes to posts and pages. You do not need to re-index periodically or anything like that to keep your Elasticsearch index updated.

Share This:

Popular on WPSteam Right Now!

Leave a Reply

Your email address will not be published. Required fields are marked *

Subscribe to Blog via Email

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Join 22 other subscribers

I need help with...

Subscribe to Blog via Email

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Join 22 other subscribers

I need help with...