Sphinx configuración. Busquedas con y sin acentos y carácteres utf8

Para aquellos que usen Sphinx como motor de búsqueda en sus aplicaciones y que necesitan realizar búsquedas independientes de los acentos (buscar “jose” y encontrar “jose” y “josé”), también que sea capaz de buscar eñes, les vendrá muy bien la siguiente configuración del charset para español.

charset_table = 0..9, A..Z->a..z, _, -, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F, 
U+C7->U+E7, U+E7, 
        U+D1->U+F1, U+F1, 
        U+DD->y, U+FD->y, 
        U+C0->a, U+C1->a, U+C2->a, U+C3->a, U+C4->a, U+C5->a, 
        U+E0->a, U+E1->a, U+E2->a, U+E3->a, U+E4->a, U+E5->a, 
        U+C8->e, U+C9->e, U+CA->e, U+CB->e, 
        U+E8->e, U+E9->e, U+EA->e, U+EB->e, 
        U+CC->i, U+CD->i, U+CE->i, U+CF->i, 
        U+EC->i, U+ED->i, U+EE->i, U+EF->i, 
        U+D2->o, U+D3->o, U+D4->o, U+D5->o, U+D6->o, 
        U+F2->o, U+F3->o, U+F4->o, U+F5->o, U+F6->o, 
        U+D9->u, U+DA->u, U+DB->u, U+DC->u, 
        U+F9->u, U+FA->u, U+FB->u, U+FC->u

        charset_type                            = utf-8

ejemplo de uno de mis index en Sphinx

index mi_indice
{
        source                                  = mi_indice
        path                                    = /path/completo_a_indice/mi_indice
        docinfo                                 = extern

        charset_table = 0..9, A..Z->a..z, _, -, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F, 
        U+C7->U+E7, U+E7, 
        U+D1->U+F1, U+F1, 
        U+DD->y, U+FD->y, 
        U+C0->a, U+C1->a, U+C2->a, U+C3->a, U+C4->a, U+C5->a, 
        U+E0->a, U+E1->a, U+E2->a, U+E3->a, U+E4->a, U+E5->a, 
        U+C8->e, U+C9->e, U+CA->e, U+CB->e, 
        U+E8->e, U+E9->e, U+EA->e, U+EB->e, 
        U+CC->i, U+CD->i, U+CE->i, U+CF->i, 
        U+EC->i, U+ED->i, U+EE->i, U+EF->i, 
        U+D2->o, U+D3->o, U+D4->o, U+D5->o, U+D6->o, 
        U+F2->o, U+F3->o, U+F4->o, U+F5->o, U+F6->o, 
        U+D9->u, U+DA->u, U+DB->u, U+DC->u, 
        U+F9->u, U+FA->u, U+FB->u, U+FC->u

        charset_type                            = utf-8
        stopwords                               =/path/completo_a_indice/stopwords.txt
}

ACTUALIZACIÓN (05-04-2010)

Después de mucho pelearme con los acentos y las eñes con Sphinx he conseguido optimizar y dar con el charset adecuado.

 charset_table = 0..9, A..Z->a..z, a..z, 
                                U+DD->y, U+FD->y, 
                                U+D1->n, U+F1->n, 
                                U+C0->a, U+C1->a, U+C2->a, U+C3->a, U+C4->a, U+C5->a, 
                                U+E0->a, U+E1->a, U+E2->a, U+E3->a, U+E4->a, U+E5->a, 
                                U+C8->e, U+C9->e, U+CA->e, U+CB->e, 
                                U+E8->e, U+E9->e, U+EA->e, U+EB->e, 
                                U+CC->i, U+CD->i, U+CE->i, U+CF->i, 
                                U+EC->i, U+ED->i, U+EE->i, U+EF->i, 
                                U+D2->o, U+D3->o, U+D4->o, U+D5->o, U+D6->o, 
                                U+F2->o, U+F3->o, U+F4->o, U+F5->o, U+F6->o, 
                                U+D9->u, U+DA->u, U+DB->u, U+DC->u, 
                                U+F9->u, U+FA->u, U+FB->u, U+FC->u, U+0027

Ejemplo de uno de mis index

index mi_index
{
 source                    = mi_source
 path                    = /path/a/mi/indice/indices/mi_index
 docinfo                    = extern
 mlock = 0
 charset_type = utf-8
 charset_table = 0..9, A..Z->a..z, a..z, 
 U+DD->y, U+FD->y, 
 U+D1->n, U+F1->n, 
 U+C0->a, U+C1->a, U+C2->a, U+C3->a, U+C4->a, U+C5->a, 
 U+E0->a, U+E1->a, U+E2->a, U+E3->a, U+E4->a, U+E5->a, 
 U+C8->e, U+C9->e, U+CA->e, U+CB->e, 
 U+E8->e, U+E9->e, U+EA->e, U+EB->e, 
 U+CC->i, U+CD->i, U+CE->i, U+CF->i, 
 U+EC->i, U+ED->i, U+EE->i, U+EF->i, 
 U+D2->o, U+D3->o, U+D4->o, U+D5->o, U+D6->o, 
 U+F2->o, U+F3->o, U+F4->o, U+F5->o, U+F6->o, 
 U+D9->u, U+DA->u, U+DB->u, U+DC->u, 
 U+F9->u, U+FA->u, U+FB->u, U+FC->u, U+0027
 min_word_len = 1
 html_strip = 0
 stopwords               =/path/a/stopwords/stopwords.txt

}

es muy importante tener las tablas y los datos en las tablas en UTF8 y en el source añadir la siguiente instrucción.

sql_query_pre = SET NAMES utf8

10 opiniones en “Sphinx configuración. Busquedas con y sin acentos y carácteres utf8”

  1. luego de mucho buscar, la solución mas sensilla y rápida es generar una tabla nueva con los registros a buscar y el campo principal convertirlo a ascii (por ejemplo uso la clase inflection de fuelphp) y a partir de aqui ya indexo todo son acentos. Luego filtro los parametros de busqueda de la misma manera y el match es perfecto.
    Saludos

    1. Y que pasa si tienes una tabla que pesa muchísimo y que tiene demasiado contenido como para volver a indexarlo nuevamente? Luego donde buscas? sobre la original y la nueva o solo la nueva?

      te digo que así a bote pronto me suena a un parche, aunque no descarto que tu solución pueda ser la mejor, pero no la veo, es que eso de “una nueva tabla con los registros a buscar”, y cuales son los registros a buscar? Todos los que tengan acento? o cuales.

      De todas maneras Pablo muchas gracias por tu comentario, aunque si lo pudieras explicar con más detalle y argumento sería mucho mejor!

      Un saludo!

  2. Una pregunta Pedro,

    ¿cómo puedo imprimir o comprobar el valor del campo weight de cada uno de los resultados que me devuelve el sistema al hacer una búsqueda con Sphinx? Muchas gracias

  3. Muchas gracias por el charset_table para el config de sphinx… He hecho unas cuantas pruebas y parece que todo ok!

    Lo dicho, muchas gracias y un saludo!

  4. Me has salvado la vida, man. Me estaba volviendo loco probando charset tables. pero hasta que no vi en tu post la entrada sobre set names utf8 no logre nada.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *