Inicio > PHP > Sphinx

SPHINX

24/11/2017PHP

 

Hace ya tiempo que quería escribir un post sobre el indexador sphinx. Lo usamos nn la empresa donde estoy trabajando actualmentey la verdad es que no es muy difícil. Aunque, como todo, siempre se pueden hacer cosas más complejas según las necesidades.
El ejemplo que voy a poner es bastante sencillo para que se entienda como funciona el indexador.
Lo primero es preparar el archivo de configuración, donde se le indicará a sphinx donde almacenar los índices y la query para generar dichos índices. Dicho archivo se llamará sphinx.conf y yo lo tengo en la carpeta donde tengo el sphinx aunque se puede configurar para poner dicho archivo en cualquier otro sitio.
Ejemplo del fichero de configuración:

source busquedas
{
#Configuración de bbdd type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = sphinx
sql_port = 3306

#Query de datos para indexar sql_query =
SELECT id, label, description, begin_production, end_production
FROM model

sql_attr_uint = id # Atributo id para buscar después de indexar
sql_attr_timestamp = begin_production #attibuto fecha

sql_query_info = SELECT * FROM model WHERE id=$id
}
index busquedasx
{
source = busquedas
path = /xampp/htdocs/sphinx/busquedas1 #ruta donde se indexará el contenido
docinfo = extern
charset_type = utf-8
stopwords =/path/a/stopwords/stopwords.txt
}

indexer
{
mem_limit = 32M
}
searchd
{
listen = 127.0.0.1
port = 3312
log = /xampp/htdocs/sphinx/searchd.log
query_log = /xampp/htdocs/sphinx/query.log
read_timeout = 5
max_children = 30
pid_file = /xampp/htdocs/sphinx/searchd.pid
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 0
unlink_old = 1
crash_log_path = /var/log/sphinx/crash


Nota: Donde pone stopwords y una ruta es donde se encuentra el fichero en el que se le indica a sphinx que palabras no indexar como artículos, determinantes, etc...
Dicho fichero es un fichero de texto (.txt) donde irán las palabra separadas por un espacio.
Lo descrito arriba es un ejemplo sencillo, muy sencillo. Aconsejo profundizar más para adaptar los atributos, etc...Después de ajustar el fichero de configuración de sphinx hay que indexar el contenido en base al fichero de configuración y ya luego ya con el php realizar las búsquedas. Conviente tener un cron para indexar cada cierto tiempo ya que la base de datos se irá actualizando con contenido con cierta regularidad y conviene indexar ese contenido nuevo.


//Se instancia el objeto de sphinx
$s = new SphinxClient();

//Se establece el server de sphinx
$s->setServer("localhost", 9312);
//Se indica el modo de búsqueda
$s->setMatchMode(SPH_MATCH_ANY);
//Se lanza la búsqueda ver que 'busquedasx' está definido en el fichero sphinx.conf $result = $s->Query( 'texto a buscar', 'busquedasx' );
var_dump($result);

Los diferentes modos de búsqueda que hay en php para sphinx son:
-SPH_MATCH_ALL: Busca coincidencias en todas las palabras(modo por defecto).
-SPH_MATCH_ANY: Busca coincidencia en cualquiera de las palabras de la query.
-SPH_MATCH_PHRASE: Busca coincidencia como frase, requiere una coincidencia exacta.
-SPH_MATCH_BOOLEAN: Busca coincidencia como una expresión booleana.
-SPH_MATCH_EXTENDED: Busca coincidencia como una expresión sphinx interna.
-SPH_MATCH_FULLSCAN: Activa fullscan.
-SPH_MATCH_EXTENDED2: Igual que SPH_MATCH_EXTENDED peroañadiendo peso a las palabras.
Este post es un ejemplo muy sencillo y por supuesto que sphinx tiene muchas más cosas pero espero que os sirva para empezar y aprender.