Solr: búsquedas 3 veces más rápidas en WordPress

La búsqueda nativa de WordPress es un pesado Juggernaut que puede ser muy lenta, sobre todo si tienes una gran cantidad de artículos. Además existe el problema de que por defecto se muestran los artículos ordenados por fecha de publicación, no por relevancia, lo cual no es demasiado útil para ayudar a tus lectores a encontrar lo que esten buscando. En resumen, lo que queremos es una búsqueda rápida, eficiente y relevante, algo que WordPress no ofrece por defecto.

sun

En The Next Web nos hemos enfrentado recientemente a este problema, y gracias a una solución basada en Apache Solr hemos incrementado la velocidad de las búsquedas un 300%, a la vez que hemos mejorado la relevancia de los resultados mostrados. ¿Quieres saber cómo lo hemos conseguido?

Instalar Solr

Solr es un potente motor de búsqueda de código abierto. Está implementado en Java, así que necesitamos ejecutarlo algún servidor web Java como Apache Tomcat o Jetty. En nuestro caso vamos a usar Jetty ya que es facil de configurar y su carga es relativamente ligera. Dependiendo de tu versión de Linux puedes instalarlo con sudo apt-get install jetty o sudo yum install jetty.

A continuación descargaremos la última versión de Solr (3.5.0). Ten en cuenta que necesitas el runtime de Java 1.6 para que Solr funcione correctamente (Puedes averiguar la versión instalada en tu servidor con el comando java -version)

Por último vamos a crear un servicio para que sea más sencillo iniciar y detener la ejecución de Solr. (Nota: Asumimos que Solr se encuentra en el directorio /var/opt/solr. Usa el parámetro -Xmx para indicar el máximo de memoria que la máquina virtual de Java puede usar, para este ejemplo, 512MB son más que suficientes.

sudo vi /etc/init.d/solr
#chkconfig: – 80 20
#!/bin/sh -e
# Starts, stops, and restarts solr

SOLR_DIR="/var/opt/solr/example"
JAVA_OPTIONS="-Xmx512m -DSTOP.PORT=8079 -DSTOP.KEY=stopkey -jar start.jar"
LOG_FILE="/var/log/solr.log"
JAVA="/usr/bin/java"

case $1 in
start)
echo "Starting Solr"
cd $SOLR_DIR
$JAVA $JAVA_OPTIONS 2> $LOG_FILE &
;;
stop)
echo "Stopping Solr"
cd $SOLR_DIR
$JAVA $JAVA_OPTIONS –stop
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}" >&2
exit 1
;;
esac

Instalar el plugin de WordPress

Integrar Solr en nuestra aplicación es tarea sencilla, ya que hay disponibles múltiples librerias que implementan las APIs de Solr en varios lenguajes (PHP, Ruby, Phyton…). Para nuestra integración con WordPress, vamos a utilizar el plugin Solr for WordPress [1]. Basta con seguir las instrucciones del plugin para configurarlo de acorde a tus necesitades y si todo va bien tendremos el índice que nutrirá las búsquedas en pocos minutos.

Resultados

Comparando los tiempos de ejecución con xhprof, para el caso concreto de The Next Web (con unos 30,000 artículos publicados) hemos pasado de aprox. 1.8 segundos de media para realizar una búsqueda cualquiera, a 600-700 milisegundos. Esto hace la búsqueda con Solr un 300% más rápida que la búsqueda nativa de WordPress. Puedes ver los resultados aquí, por ejemplo: http://thenextweb.com?s=steve+jobs.

Esto es sólo el principio, ya que Solr contiene numerosas características avanzadas que iremos incorporando poco a poco, como sugerencias de búsqueda, resultados similares, un algoritmo de relevancia a medida…

En resumen, si debes realizar búsquedas fulltext en páginas con decenas de miles de artículos, y crees que MySQL se te queda pequeño, ¿a que estás esperando para probar Solr?


[1] Debo realizar una advertencia antes de usar este plugin (y en general cualquier plugin o librería que quieras integrar en tu proyecto). Asegúrate de que no hay bugs que comprometan la seguridad o el rendimiento de tu propio código.

En concreto, un serio problema que encontré en Solr for WordPress es que no desactiva la búsqueda nativa de WordPress, por lo que además de la consulta a Solr, internamente se sigue realizando una consulta a MySQL, aunque el resultado de esta última nunca es mostrado. Esto hace inútil nuestro propósito de mejorar la velocidad al obtener los resultados de búsqueda. Si vas a utlizar el plugin, te recomiendo que arregles este bug. Si bien no sé si esta es la mejor solución, la siguiente función, que resetea el valor de la cadena de búsqueda, ha funcionado para mí:

function s4w_filter_query( $query ) {
    if ( is_search() ) {
        $query->query_vars[s] = false;
        $query->query[s] = false;
    }
}
add_action( 'parse_query', 's4w_filter_query' );

Lee ahora: Cómo realizar mantenimiento en el servidor sin afectar tu SEO »