Usando Sphinx con UTF-8 (resolviendo problemas)
Siempre 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!
