Servicio búsqueda Sphinx Search

Descripción

Sphinx Search es un motor de indexación de texto ( y xml) que nos permite hacer búsqueda de los contenidos de los documentos.

Prerequistos

En principio un linux (o Windows) y una fuente de datos (vamos a usar una BD)

Configuración

1. Instalación

Suele haber paquetes para todas las distribuciones y windows:

Instale la aplicación.

En Centos:  yum install  sphinx

En Debian-Ubuntu:   apt-get install sphinxsearch

En MS Windows:  http://sphinxsearch.com/downloads/current/

La libreria para PHP que se ha usado es sphinxapi.php que se puede descargar de

https://github.com/sphinxsearch/sphinx/blob/master/api/sphinxapi.php

$** Ya recomiendan cambiarlo por SphinxQL
$** Sphinx usa MySQL – MariaDB como protocolo para SphinxQL entonces se puede usar todo como si fuera un MySQL – MariaDB.
$** Aqui dicen como cambiar   http://sphinxsearch.com/blog/2013/07/23/from-api-to-sphinxql-and-back-again/

2. Configuración

Sphinx necesita configurar primero dos cosas importantes

– Una fuente  :  de donde saco los textos
– Un indice:  Donde guardo los indices de esa fuente y lo que voy a usar para buscar.

En el archivo de configuración se puede cambiar

$> vim /etc/sphinxsearch/sphinx.conf

2.1  La fuente de datos  ( De donde sale los textos)

Se puede configurar una (o varias) fuente de MySQL – MariaDB, PgSQL o  ODBC

Vamos a usar el origen de datos usaremos el que viene por defecto «src1» y lo primero a configurar es el acceso a la BD

type                    = MySQL – MariaDB
sql_host                = localhost
sql_user                = test
sql_pass                = dkjkldañkfa
sql_db                  = test
sql_port                = 3306  # optional, default is 3306

Luego viene la forma en que se obtienen los datos y como se van a mapear en la base de datos propia de sphinx. Aqui es donde especifica los campos que desea que sean indexados y cuales son referencias.

sql_query    = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents

A continuacion se define quien es ID de para bd dentro de sphinx   (Por defecto se considera siempre la primera columna como ID)

sql_attr_uint               = group_id
sql_attr_timestamp      = date_added

El otro campo que hace falta es content que por defecto será el campo de indexacion.

2.2  El Indice  (Donde guarda la informacion obtenida de la fuente para la búsqueda)

Creamos la   estructura de  indexación

index test1
{
source                  = src1                                         # Origen de datos (
path                    = /var/lib/sphinx/test1                  #La ruta a la ubicación donde se almacena el índice
}

index testrt
{
type                    = rt
rt_mem_limit            = 128M

path                    = /var/lib/sphinx/testrt

rt_field                = title
rt_field                = content
rt_attr_uint            = gid
}

Este ultimo, no es necesario, pero es un ejemplo de un inidice RT (realtime) que usa un ramdisk para esto

Ya con estos cambios  tiene listo su Sphix Search para realizar indexación.

Operacion

1. Indexación

La indexación es el proceso en el que se lee una funte y se procesa en indices para una posterior busqueda

El archivo de configuración contiene unos parametros para el proceso de indexación:

indexer
{
mem_limit               = 128M
}

Ahora ejecute la indexación a mano

$>  indexer -c /etc/sphinxsearch/sphinx.conf –all –rotate
Sphinx 2.2.11-id64-release (95ae9a6)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)

using config file ‘/etc/sphinxsearch/sphinx.conf’…
indexing index ‘test1’…
collected 73843 docs, 178.1 MB
sorted 17.8 Mhits, 100.0% done
total 73843 docs, 178102312 bytes
total 29.630 sec, 6010727 bytes/sec, 2492.10 docs/sec
indexing index ‘orfeo_index_stemmed’…
collected 73843 docs, 178.1 MB
sorted 17.8 Mhits, 100.0% done
total 73843 docs, 178102312 bytes
total 49.370 sec, 3607481 bytes/sec, 1495.69 docs/sec
skipping non-plain index ‘test_rt’…
total 149069 reads, 0.750 sec, 3.6 kb/call avg, 0.0 msec/call avg
total 3129 writes, 6.732 sec, 338.3 kb/call avg, 2.1 msec/call avg
WARNING: failed to open pid_file ‘/var/run/sphinxsearch/searchd.pid’.
WARNING: indices NOT rotated.

2. Busqueda

La funcion de busqueda se hace por medio de un servicio (demonio) corriendo llamado searchd. El archivo de configuracion tambien tiene aparte

searchd
{
listen                          = 9312                                        # Escucha SphinxAPI
listen                          = 9306:mysql41                          # Escucha SphinxSQL con cliente MySQL – MariaDB
log                              = /var/log/sphinx/searchd.log      # Bitacoras
query_log                   = /var/log/sphinx/query.log
read_timeout              = 5
max_children              = 30
pid_file                        = /var/run/sphinx/searchd.pid
seamless_rotate         = 1
preopen_indexes        = 1
unlink_old                   = 1
workers                       = threads                            # for RT to work
binlog_path                 = /var/lib/sphinx/
}

Y pues debe estar corriendo ..

$>  systemctl status searchd

Puede verificar que exista la tabla de indices.

$> MySQL – MariaDB -h0 -P9306
$MySQL – MariaDB> show tables;

Index
Type
test
testrt
local
rt

4 rows in set (0.00 sec)

$MySQL – MariaDB> select count (*) from orfeo_index

Ya esta indexada la información, puede hacer pruebas con un archivo de ejemplo, en php

 <?php
    include('sphinxapi.php');

    $cl = new SphinxClient();
    $cl->SetServer( "localhost", 9312 );
    $cl->SetMatchMode( SPH_MATCH_ANY );

    // el primer parámetro es la query, es lo que queremos buscar: cumpleaños
    // el segundo parámetro es el index que vamos a usar para buscarlo

    $result = $cl->Query( 'reina', 'orfeo_index' ); //Aqui realizamos el query de busqueda con los parametros a buscar y el index donde encuentra la información

    if ( $result === false ) {
            echo "fallo en Query: " . $cl->GetLastError() . ".n";
    }
    else {
            if ( $cl->GetLastWarning() ) {
                    echo "WARNING: " . $cl->GetLastWarning() . "                       ;
            }

            if ( ! empty($result["matches"]) ) {
                    foreach ( $result["matches"] as $doc => $docinfo ) {
                                echo "$docn";
                    }

                echo "<pre>";
                   print_r( $result );
                echo "<pre/>";
            }
    }

    exit;
?>                               

3. Indexación automatica

Para la indexación automatica se debera crear una tarea en el cron del sistema, este cron lo ajustaremos a 10 minutos.

*/10 * * * * /usr/bin/indexer –rotate –config /etc/sphinxsearch/sphinx.conf –all

Aqui toca evaluar cuantos documentos tiene y que estrategia tiene para mantener el indice.

 

Trucos

1: Puede utilizar  » \ » para realizar saltos de linea en » sql_query «.
2: Sphinx Search se autolimita a mostrar solo 20 resultados por query, en  sql_query al finalizar el archivo puede agregar » limit 0, 1000000 option max_matches=1000000  «, con esta instrucción le trae todos los resultados.

Problemas

 

Referencias

– Una presentacion bonita  http://astellar.com/downloads/2011-Vladimir-Fedorkov-nyphp2011-Full-Text-Search-with-Sphinx-and-PHP.pdf

http://sphinxsearch.com/wiki/doku.php?id=sphinx_articles
http://blog.mageworx.com/2016/05/sphinx-the-beginners-guide/
http://nyphp.org/resources/full-text-search-sphinx-php.pdf
http://sphinxsearch.com/wiki/doku.php?id=reference_examples
http://manpages.ubuntu.com/manpages/xenial/man1/indexer.1.html
http://www.devlifeline.com/2013/08/multiple-sphinx-instances.html

FIN

 

NOTA

min_word_len      = 3    # El número mínimo de caracteres necesario para iniciar la búsqueda
min_prefix_len    = 0    # Si 0 – la configuración está desactivada,> 0 – el número mínimo de caracteres al principio de una consulta de búsqueda que es necesario para iniciar la búsqueda
min_infix_len     = 3    # Si 0 – la configuración está desactivada,> 0 – el número mínimo de caracteres de toda la palabra, necesario para iniciar la búsqueda