Sphinx – search engine

logo

Hola miembros de qbit y seguidores del blog, hace poco tiempo tuve la oportunidad de trabajar con sphinx (search engine).
Para lo siguiente necesitamos:

* Linux
* Sphinx aquí
* Base de datos por lo menos con una tabla para probar.

Después de realizar la instalación de sphinx en linux.
Buscamos el archivo con el nombre “sphinx.conf.in” que se encuentra dentro de la carpeta de sphinx, Una vez ahí abrir el archivo con editor de texto de su preferencia (nano, vi, etc.). Voy a explicar un poco del archivo y la configuración básica para el funcionamiento.
El primer apartado es el de source aquí encontramos la configuración.
 

# src1 - el nombre nuestra configuración fuente.
Source src1 {
# Defenir el tipo de búsqueda que realizaremos.
# Tipo de conexión podemos elegir -> mysql, pgsql, mssql, xmlpip
Type = mysql

# Si seleccionamos mysql - escribir los datos para la conexión con la base de datos, creo que no hay mas que explicar aquí.
sql_host = localhost
sql_user = test
sql_pass =
sql_db = test
sql_port = 3306 # Opciona ya que por default es 3306

# Es la consulta de la en la cual realizaremos la búsqueda de texto
# Recordatorio la "\" es solo un salto de linea
sql_query = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents

# Aquí podemos los atributos por los cuales podemos agrupar la consulta
# esto resulta útil al momento de agrupar una sola parte y establecer un rango en la búsqueda
sql_attr_uint = group_id

}

# configuración de los indices
index index_src1{
# seleccionar la fuente y el directorio donde se crearan los indices
source = src1
path = /home/usuario/sphinx/data/file
docinfo = extern
}

# Establecemos el limite memoria cache
indexer{
mem_limit = 256M
}

# Aquí encontramos la configuración log
# Configuración máxima de conexiones y el tiempo limite
# Máximo de match o filas a buscar
# puerto de de escucha
searchd{
listen = 9312
log = /var/log/sphinxsearch/searchd.log
query_log = /var/log/sphinxsearch/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/sphinxsearch/searchd.pid
# max_matches = 1000
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # for RT to work
binlog_path = /home/usuario/sphinx/data
}

 

Después del archivo de configuración guardar este en la ruta del defautl, No olvidar agregar permisos de escritura a los archivos de log. Aquí encontramos el archivo de configuración

/usr/local/etc/sphinx.conf 

Por omisión en linux podemos encontrar sphinx en la siguiente ruta

cd /usr/local/bin/ 

Donde ejecutaremos

indexer --all 

esto para indexar los resultados de la tabla

 


 

Cliente Sphinx
Podemos crear en php un pequeño cliente que se conecta al sphinx

// Usar la libreria para php sphinx
require_once sphinxapi.php
$client = new SphinxClient();
$client->setServer( servidor, puerto );
// Respuesta siempre como Array
$client->SetArrayResult(true);
// Establecer Limit de la consulta
$client->SetLimits( 0, 50 );
// Aquí es algo importante ya que se pueden establecer varios tipos de búsqueda y esto afecta al resultado
// Establecer tipo match en la cadenas
$client->SetMatchMode( SPH_MATCH_ANY );

/* Son la que he utilizado pero existen otras
SPH_MATCH_ALL = coincide con todas las palabras de la consulta
SPH_MATCH_ANY = coincide con alguna de las palabras de la consulta;
SPH_MATCH_BOOLEAN = coincide con la consulta como una expresión booleana;
SPH_MATCH_EXTENDED = coincide con la consulta como una expresión de esfinge lenguaje de consulta
SPH_MATCH_EXTENDED2 =
*/

// Establecer filtro por medio de los parámetros con los que agrupamos la consulta
// dentro del archivo de configuración agregamos un "sql_attr_uint"
// por ejemplo es como si el mysql se realizara un Where filter in (value)
$client->SetFilter( $filter , $value );

// Por último colocamos la palabra o la consulta sphinx y el nombre del indice donde realizaremos la consulta
$result = $client->query($query, $indice);

Sphinx si realiza las búsquedas mas rápido en comparación con el motor de mysql, aunque  hay un problema para poder actualizar los nuevos  registro hay que volver a  realizar un  ” indexer –all “.

Bueno para finalizar si no les agrada esto aquí la documentacion de sphinx

Israel Arizmendi

Aprendiz de starcraft

Twitter Google+ 

Compartir en...Tweet about this on TwitterPin on Pinterest0Share on LinkedIn0Share on Google+0Share on Facebook4