systemadmin.es > Buscador > Buscador de WordPress con Sphinx

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 🙂

6 comments to “Buscador de WordPress con Sphinx”

  1. Excelente guía!!

    Estaba yo peleandome con el Sphinx y tu documento me ha ido de perlas.

    Directo al delicious 🙂

  2. 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.

  3. 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,

  4. 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.

  5. 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. 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….

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>