Redis is a key value storage system that can be configured to speed up websites and those running WordPress and WooCommerce. It is typically used as the fast storage system for WordPress and WooCommerce external object cache (using for example this plugin). But Redis has grown and become more versatile! You can actually build modules for Redis and one of those is called RedisSearch.
Thanks to Foad Yousefi, we have a plugin that can leverage RediSearch and it appears to be a fork of ElasticPress which uses Elasticsearch (installation guide) as the search engine for WordPress and WooCommerce whenever possible. The Redis equivalent plugin of ElasticPress is called RediSearch just like the module.
This tutorial does assume you have already installed Redis server. We will be using Ubuntu 18.04 for this tutorial to build the RediSearch extension and add it to our Redis configuration. You will generally need root or sudo access to accomplish this.
You should test this on a staging server first!
Getting Started with RediSearch
First we need to build the RediSearch extension and afterwards we need to configure the RediSearch WordPress plugin.
Build RediSearch Module Extension
First let's update our package repostiory list and install the building tools and git
apt update apt install cmake build-essential git -y
Enter your temporary folder and clone the repo, enter the folder and generate the build file
cd /tmp git clone https://github.com/RedisLabsModules/RediSearch.git cd RediSearch/cmake cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo
You should see a lot of output like this
-- The C compiler identification is GNU 7.3.0 -- The CXX compiler identification is GNU 7.3.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Performing Test HAVE_W_INCOMPATIBLE_POINTER_TYPES -- Performing Test HAVE_W_INCOMPATIBLE_POINTER_TYPES - Success -- Performing Test HAVE_W_DISCARDS_QUALIFIERS -- Performing Test HAVE_W_DISCARDS_QUALIFIERS - Failed CMake Deprecation Warning at CMakeLists.txt:6 (CMAKE_POLICY): The OLD behavior for policy CMP0026 will be removed from a future version of CMake. The cmake-policies(7) manual explains that the OLD behaviors of all policies are deprecated and that a policy should be set to OLD only under specific short-term circumstances. Projects should be ported to the NEW behavior and not rely on setting a policy to OLD. v1.4.2-303-g90fd9d41 CMake Warning (dev) at CMakeLists.txt:113 (GET_TARGET_PROPERTY): Policy CMP0045 is not set: Error on non-existent target in get_target_property. Run "cmake --help-policy CMP0045" for policy details. Use the cmake_policy command to set the policy and suppress this warning. get_target_property() called with non-existent target "example_extension". This warning is for project developers. Use -Wno-dev to suppress it. -- Configuring done -- Generating done -- Build files have been written to: /tmp/RediSearch/cmake
Now you can build the RediSearch module with this command
You will see a long list of output which finishes like this
Scanning dependencies of target redisearch [ 91%] Building C object CMakeFiles/redisearch.dir/src/module-init/module-init.c.o [ 92%] Linking C shared library redisearch.so [ 92%] Built target redisearch Scanning dependencies of target sizes [ 92%] Building CXX object CMakeFiles/sizes.dir/src/c_utils/sizes.cpp.o [ 93%] Linking CXX executable sizes [ 93%] Built target sizes Scanning dependencies of target redisearchS [ 93%] Linking C static library libredisearchS.a [ 93%] Built target redisearchS Scanning dependencies of target test_vector [ 94%] Building C object src/rmutil/CMakeFiles/test_vector.dir/test_vector.c.o [ 95%] Linking C executable test_vector [ 95%] Built target test_vector Scanning dependencies of target test_args [ 96%] Building C object src/rmutil/CMakeFiles/test_args.dir/test_args.c.o [ 96%] Linking C executable test_args [ 96%] Built target test_args Scanning dependencies of target test_cmdparse [ 97%] Building C object src/rmutil/CMakeFiles/test_cmdparse.dir/test_cmdparse.c.o [ 97%] Linking C executable test_cmdparse [ 97%] Built target test_cmdparse Scanning dependencies of target test_heap [ 98%] Building C object src/rmutil/CMakeFiles/test_heap.dir/test_heap.c.o [ 98%] Linking C executable test_heap [ 98%] Built target test_heap Scanning dependencies of target test_periodic [ 99%] Building C object src/rmutil/CMakeFiles/test_periodic.dir/test_periodic.c.o [ 99%] Linking C executable test_periodic [ 99%] Built target test_periodic Scanning dependencies of target test_priority_queue [100%] Building C object src/rmutil/CMakeFiles/test_priority_queue.dir/test_priority_queue.c.o [100%] Linking C executable test_priority_queue [100%] Built target test_priority_queue
Now there is an extension file called
redisearch.so in the
Let's copy that somewhere that makes sense and make a Redis modules folder, then copy over the extension file
mkdir -p /etc/redis/modules cp /tmp/RediSearch/cmake/redisearch.so /etc/redis/modules/redisearch.so
Now reference this module in the
redis.conf file by adding this line
To do so you can use nano or your favorite Linux text editor
sudo nano /etc/redis/redis.conf
I added it at the bottom here, you may want to adjust how much RAM is available to Redis as well in the future.
# create a unix domain socket to listen on #unixsocket /var/run/redis/redis.sock # set permissions for the socket #unixsocketperm 775 # requirepass passwordtouse bind 127.0.0.1 daemonize yes stop-writes-on-bgsave-error no rdbcompression yes # maximum memory allowed for redis maxmemory 500M # how redis will evict old objects - least recently used maxmemory-policy allkeys-lru loadmodule /etc/redis/modules/redisearch.so
Reload Redis server to activate the new configuration with RediSearch module enabled.
sudo service redis-server restart
Now it is time to move on to the application side of things and configure the WordPress plugin to work with RediSearch.
Configure the RediSearch WordPress Plugin
Time to install the RediSearch WordPress plugin. I prefer to do this via WP-CLI
wp plugin install redisearch --activate
Now we need to add the Redis server settings in the RediSearch plugin.
In the wp-admin sidebar find Redisearch and then go choose Redis server
For the Redis server set 127.0.0.1 or your address in
For the Redis port set 6379 or whatever is set in your
Give the index a name under Redisearch index name and click Save
Now navigate to Redisearch > Indexing options
Choose your options here, I recommend checking Write redis data to the disk so that you do not have to re-index if Redis restarts for one reason or another.
Remember to click Save changes.
Now you can start the indexing process by going to Redisearch > Redisearch
Click the icon on the left to begin the indexing from MySQL to Redis.
That should take care of it!
Verify RediSearch Index Data
If you want to verify that your WordPress or WooCommerce data was indexed using RediSearch you can log in to the Redis server via the Redis cli.
You should then see this prompt which shows you are in the Redis-CLI administration prompt.
Then you can type
INFO keyspace at the
127.0.0.1:6379> prompt and select the database that shows up (here
INFO keyspace # Keyspace db0:keys=4149,expires=0,avg_ttl=0
Selecting the Redis database in the CLI is this simple
If the database exists you will get this message showing success
Then you can list all of the keys for that index
When you are done you can exit the redis-cli
I hope you had fun with this 🙂