Exodica Blog Otro blog de esos….

9Sep/110

Usando Sphinx con UTF-8 (resolviendo problemas)

utf-8Siempre hay algun problema con el encoding, en mi caso para resolver estas batallas, hace años que hago absolutamente TODO en UTF-8, no hay otro encoding!, es el universal, el unicode que sirve para todo y alque tendriamos que tener como estandar defacto en todo! Hasta donde me acuerdo MySQL seguia usando latin1 por default... no se puede...

En fin, luego de tener la Base de datos 100% UTF-8 (eso quiere decir a la hora de crear cada tabla y en ocaciones campos) al pasar los datos a Sphinx siempre tenia uno que otro problema, y bueno solo hacia falta averiguar un poco.

En un motor de busquedas como es el sphinx no nos interesa mucho tener caracteres raros, no nos interesa que el que busque te no encuentre té, todo lo contrario, los errores de ortografia del lado del que busca o de nuestra data los queremos juntos, si yo busco cazería me gustaria que encuentre tambien cazeria, eso se hace con una tabla de reemplazo de caracteres, basicamente es decirle al sphinx, ú => u, al indexar los datos o buscarlos, cuando le mandemos una ú, la reemplazara por u automaticamente.

Eureka! eso era todo.... no....

Las tablas normalmente son cortas, yo he encontrado una bastante completa para pasar todos los caracteres especiales a sus equivalentes "normales" á, ä, à, â  -> a por ejemplo.

Para configurar esta tabla, dentro de la declaracion del índice debemos usar charset_table tambien debemos definir que la vamos a trabajar en UTF-8, asi que tambien tenemos que usar charset_type, aca va un ejemplo:

index MiIndice {
           source                  = srcMiSrc

           path                    = /var/lib/sphinx/data/MiIndice
           docinfo                 = extern
           morphology              = none
           min_word_len            = 2
           stopwords               = /var/lib/sphinx/stopwords-es.txt
           charset_type            = utf-8
           min_prefix_len          = 1
           min_infix_len           = 0

           charset_table =U+021, U+023, U+025, U+027, U+030..U+039, U+040..U+05a, U+07e, U+0b5, U+0c6, \
        U+0d0, U+0d8, U+0de, U+0df, U+110, U+126, U+132, U+138, U+13f, U+141, U+149, U+14a, \
        U+166, U+2019->U+027, U+061->U+041, U+0c0->U+041, U+0c1->U+041, U+0c2->U+041, \
        U+0c3->U+041, U+0c4->U+041, U+0c5->U+041, U+0e0->U+041, U+0e1->U+041, U+0e2->U+041, \
        U+0e3->U+041, U+0e4->U+041, U+0e5->U+041, U+100->U+041, U+101->U+041, U+102->U+041, \
        U+103->U+041, U+104->U+041, U+105->U+041, U+062->U+042, U+063->U+043, U+0c7->U+043, \
        U+0e7->U+043, U+106->U+043, U+107->U+043, U+108->U+043, U+109->U+043, U+10a->U+043, \
        U+10b->U+043, U+10c->U+043, U+10d->U+043, U+064->U+044, U+10e->U+044, U+10f->U+044, \
        U+065->U+045, U+0c8->U+045, U+0c9->U+045, U+0ca->U+045, U+0cb->U+045, U+0e8->U+045, \
        U+0e9->U+045, U+0ea->U+045, U+0eb->U+045, U+112->U+045, U+113->U+045, U+114->U+045, \
        U+115->U+045, U+116->U+045, U+117->U+045, U+118->U+045, U+119->U+045, U+11a->U+045, \
        U+11b->U+045, U+066->U+046, U+067->U+047, U+11c->U+047, U+11d->U+047, U+11e->U+047, \
        U+11f->U+047, U+120->U+047, U+121->U+047, U+122->U+047, U+123->U+047, U+068->U+048, \
        U+124->U+048, U+125->U+048, U+069->U+049, U+0cc->U+049, U+0cd->U+049, U+0ce->U+049, \
        U+0cf->U+049, U+0ec->U+049, U+0ed->U+049, U+0ee->U+049, U+0ef->U+049, U+128->U+049, \
        U+129->U+049, U+12a->U+049, U+12b->U+049, U+12c->U+049, U+12d->U+049, U+12e->U+049, \
        U+12f->U+049, U+130->U+049, U+131->U+049, U+06a->U+04a, U+134->U+04a, U+135->U+04a, \
        U+06b->U+04b, U+136->U+04b, U+137->U+04b, U+06c->U+04c, U+139->U+04c, U+13a->U+04c, \
        U+13b->U+04c, U+13c->U+04c, U+13d->U+04c, U+13e->U+04c, U+06d->U+04d, U+06e->U+04e, \
        U+0d1->U+04e, U+0f1->U+04e, U+143->U+04e, U+144->U+04e, U+145->U+04e, U+146->U+04e, \
        U+147->U+04e, U+148->U+04e, U+06f->U+04f, U+0d2->U+04f, U+0d3->U+04f, U+0d4->U+04f, \
        U+0d5->U+04f, U+0d6->U+04f, U+0f2->U+04f, U+0f3->U+04f, U+0f4->U+04f, U+0f5->U+04f, \
        U+0f6->U+04f, U+14c->U+04f, U+14d->U+04f, U+14e->U+04f, U+14f->U+04f, U+150->U+04f, \
        U+151->U+04f, U+070->U+050, U+071->U+051, U+072->U+052, U+154->U+052, U+155->U+052, \
        U+156->U+052, U+157->U+052, U+158->U+052, U+159->U+052, U+073->U+053, U+15a->U+053, \
        U+15b->U+053, U+15c->U+053, U+15d->U+053, U+15e->U+053, U+15f->U+053, U+160->U+053, \
        U+161->U+053, U+17f->U+053, U+074->U+054, U+162->U+054, U+163->U+054, U+164->U+054, \
        U+165->U+054, U+075->U+055, U+0d9->U+055, U+0da->U+055, U+0db->U+055, U+0dc->U+055, \
        U+0f9->U+055, U+0fa->U+055, U+0fb->U+055, U+0fc->U+055, U+168->U+055, U+169->U+055, \
        U+16a->U+055, U+16b->U+055, U+16c->U+055, U+16d->U+055, U+16e->U+055, U+16f->U+055, \
        U+170->U+055, U+171->U+055, U+172->U+055, U+173->U+055, U+076->U+056, U+077->U+057, \
        U+174->U+057, U+175->U+057, U+078->U+058, U+079->U+059, U+0dd->U+059, U+0fd->U+059, \
        U+0ff->U+059, U+176->U+059, U+177->U+059, U+178->U+059, U+07a->U+05a, U+179->U+05a, \
        U+17a->U+05a, U+17b->U+05a, U+17c->U+05a, U+17d->U+05a, U+17e->U+05a, U+0e6->U+0c6, \
        U+0f0->U+0d0, U+0f8->U+0d8, U+0fe->U+0de, U+111->U+110, U+127->U+126, U+133->U+132, \
        U+140->U+13f, U+142->U+141, U+14b->U+14a, U+153->U+152, U+167->U+166

}

En fin ahi tienen la tabla de reemplazos y ya tenemos seteado que vamos a usar UTF-8...  Si en este punto funciona todo, los felicito, a mi no.

Entonces tengo los datos de MySQL en UTF-8, el Sphinx seteado a UTF-8 y la tabla de reemplazos lista, pero no me funciona la busqueda si busco araméo.

Pensando un poco (bueh esta bien, buscando como loco en Google), encuentro lo que me faltaba, tenemos todo en UTF-8 menos algo... el canal de transmicion de MySQL!!!!

Eso en MySQL se resuelve ejecutando SET NAMES utf8, pero como ejecuto esto antes de que el sphinx empieze a chupar datos? Y ahí tenemos a nuestro amigo sql_query_pre que nos ejecura una instruccion SQL antes de extraer, asi en nuestro Source podemos configurar:

source MiSrc
{
        type                            = mysql
        sql_host                        = server
        sql_user                        = user
        sql_pass                        = pass
        sql_db                          = BaseDeDatos
        sql_port                        = 3306  # optional, default is 3306
        sql_query_pre                   = SET NAMES utf8
        sql_query                       = select aid, name, description, tags, FROM Articulos WHERE hab = 1
        sql_query_post          =
        sql_query_info          =  select aid, name FROM Articulos WHERE aid = $id
}

En fin... Problema resuelto!

Oscar J. Gentilezza Arenas (Exos) Programador y curioso en lo relacionado en la informatica, actualmente trabaja de programador web usando PHP y manteniendo servidores en GNU/Linux y FreeBSD
Comments (0) Trackbacks (0)

No comments yet.


Leave a comment


No trackbacks yet.

Cerrar
Enviar por Correo