Buscador de WordPress con Sphinx
Hemos implementado un buscador para WordPress con Sphinx. Se trata de un buscador a texto completo que mejora mucho al tipico fulltext de MySQL, el cual además, esta limitado a tablas MyISAM.
Para su instalación en castellano se deben seguir los siguientes pasos:
Descargar Sphinx desde: http://www.sphinxsearch.com/downloads/sphinx-0.9.8.tar.gz. Lo descomprimimos y entramos:
# tar xzf sphinx-0.9.8.tar.gz # cd sphinx-0.9.8
Ahora toca descargar el steammer en castellano desde: http://snowball.tartarus.org/dist/libstemmer_c.tgz. Éste lo descomprimimos dentro del directorio del sphinx y hacemos el siguiente configure:
# tar xzf libstemmer_c.tgz # ./configure --prefix=/usr/local --exec-prefix=/usr/local \ --with-mysql=/usr/local --with-libstemmer # make && make install
Ahora ya esta instalado el Sphinx, debemos proceder a su configuración mediante el fichero /usr/local/etc/sphinx.conf. Un ejemplo simple para el caso de WordPress sería:
source src_wp_main
{
type = mysql
sql_host = localhost
sql_user = wordpressuser
sql_pass = wordpresspassword
sql_db = wordpress
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query = select ID, post_title, post_content \
from wp_posts \
where post_status="publish"
sql_query_info = select post_title, post_content \
from wp_posts \
where post_status="publish" and ID=$id
}
index wp_main
{
source = src_wp_main
path = /var/data/sphinx/wp_main
docinfo = extern
morphology = libstemmer_spanish
min_word_len = 1
charset_type = utf-8
html_strip = 1
charset_table = 0..9, A..Z->a..z, a..z, \
U+C0->a, U+C1->a, U+C2->a, U+C3->a, \
U+C4->a, U+C5->a, U+C6->a, \
U+C7->c,U+E7->c, U+C8->e, U+C9->e, \
U+CA->e, U+CB->e, U+CC->i, \
U+CD->i, U+CE->i, U+CF->i, U+D0->d, \
U+D1->n, U+D2->o, U+D3->o, \
U+D4->o, U+D5->o, U+D6->o, U+D8->o, \
U+D9->u, U+DA->u, U+DB->u, \
U+DC->u, U+DD->y, U+DE->t, U+DF->s, \
U+E0->a, U+E1->a, U+E2->a, U+E3->a, \
U+E4->a, U+E5->a, U+E6->a, \
U+E7->c,U+E7->c, U+E8->e, \
U+E9->e, U+EA->e, U+EB->e, U+EC->i, \
U+ED->i, U+EE->i, U+EF->i, \
U+F0->d, U+F1->n, U+F2->o, U+F3->o, \
U+F4->o, U+F5->o, U+F6->o, \
U+F8->o, U+F9->u, U+FA->u, U+FB->u, \
U+FC->u, U+FD->y, U+FE->t, U+FF->s,
}
indexer
{
mem_limit = 64M
}
searchd
{
address = 127.0.0.1
port = 3312
log = /var/data/sphinx/log/searchd.log
query_log = /var/data/sphinx/log/query.log
read_timeout = 5
max_children = 30
pid_file = /var/data/sphinx/log/searchd.pid
max_matches = 100
}
A continuación debemos realizar la primera indexación (es el ejemplo de un blog mucho más grande para que se vea su rapidez):
$ indexer --config /usr/local/etc/sphinx.conf --rotate wp_main Sphinx 0.9.8-release (r1371) Copyright (c) 2001-2008, Andrew Aksyonoff using config file '/usr/local/etc/sphinx.conf'... indexing index 'wp_main'... collected 2249764 docs, 845.0 MB sorted 148.3 Mhits, 100.0% done total 2249764 docs, 845045044 bytes total 373.987 sec, 2259560.00 bytes/sec, 6015.63 docs/sec
Se aprecia que ha tardado 373 segundos (unos 6 minutos) para indexar 2249764 documentos, dando una proporción de 6015.63 docs/sec.
Evidentement esta operación se debe realizar periodicamente para actualizar el índice. Para mejorar el rendimiento, en lugar de indexar todos los documentos cada vez, se puede hacer mediante el diferencial de un índice total que se haga por la noche.
Para poder buscar mediante este índice de Sphinx se debe modificar el fichero search.php de nuestro estilo. Su blucle sería:
<?php
$index = "wp_main";
include('sphinxapi.php');
$cl = new SphinxClient();
$cl->SetServer( "localhost", 3312 );
$cl->SetMatchMode( SPH_MATCH_ANY );
#$cl->SetFilter( 'tema_title', array( 2 ) );
#$data = implode(" ", $argv);
$query=strip_tags($_GET['s']);
$result = $cl->Query( $query, $index );
if ( $result === false )
{
echo "Error en la query: " . $cl->GetLastError() . ".\n";
}
else
{
if ( $cl->GetLastWarning() )
{
echo "Cuidadin: " . $cl->GetLastWarning();
}
if ( ! empty($result["matches"]) )
{
foreach ( $result["matches"] as $index => $info )
{
$search_posts = get_posts('p='.$index);
foreach( $search_posts as $post ) :
?>
<div class="entry">
<div class="indicator">•</div>
<h2><a href="<?php the_permalink(); ?>">
id="post-<?php the_ID(); ?>"
<?php the_title(); ?>
</a></h2>
<?php echo $post->post_content; ?>
<?php the_content(); ?>
</div>
<?php endforeach; ?>
<?php
}
}
}
?>
Unos ejemplos de busquedas de este blog mediante sphinx serían:
Evidentemente este buscador se puede mejorar mediante los diferenciales del índice, indexando comentarios… Solo es questión de entretenerse
Relacionados
Imprimir
7. February 2009 at 9:15 pm :
Excelente guía!!
Estaba yo peleandome con el Sphinx y tu documento me ha ido de perlas.
Directo al delicious
13. April 2009 at 7:52 am :
Hola, disculpa la ignorancia, pero no entendi cuando dices
Lo descomprimimos y entramos:
# tar xzf sphinx-0.9.8.tar.gz
# cd sphinx-0.9.8
son comandos de consola o algo asi?
…me he quedado alli pegado, ojala puedas explicarme eso…tengo mi instalacion de wordpress, accesos via ftp, acceso a la DB etc….pero no me cuadran las expliaciones para instalarlo…GRACIAS.
PD…No estaria mal una checkbox para que me envie al mail las respuestas a este post.
14. April 2009 at 8:43 pm :
Efectivamente se tratan de comandos de consola. No todos los hostings ofrecen acceso a la shell (y mucho menos dejar daemons en background) por lo que pueden imposibilitar la instalación y uso de sphinx.
Por lo que comentas del correo, tenemos que estudiarlo para evitar que se use esta característica del site para mandar correo no deseado.
saludos,
27. April 2009 at 6:21 pm :
Entiendo que sphinx sólo te devuelve el índice y que tu después haces el select contra la base de datos? Es decir, no te devuelve el texto sino sólo el índice de la tabla dónde puedes encontrarlo?
Gracias.
28. April 2009 at 7:50 am :
Exactamente. Realiza el “trabajo sucio” de encontrar lo que coincide pero luego tienes que recuperar tu los datos.
Puedes por otro lado parchear MySQL para integrar Sphinx como storage engine, pero yo no recomendaría esta opción.
6. May 2009 at 10:51 pm :
Que lastima que aun no tengas una opcion para avisarme al mail cuando hayan nuevos post, ojala puedas implementarla, asi nos haces la vida mas facil a quienes estamos interesados en tu post.
Bueno, lo de los comandos por consola no los he usado nunca por lo que desconozco como usarlos. Mi hosting es Dreamhost.
Imagino que tiene que haber una forma mas clasica como la instalacion de 5 minutos de wordpress donde vas subiendo los archivos ya descomprimidos y sin entrar comandos por consola.
He descargado la ultima version de sphinx
sphinx-0.9.8.1.tar.gz (950 KB)
y la he descomprimido en mi escritorio
hasta alli he quedado….