Pregunta

Tengo una tabla mysql que contiene 40 millones de discos que está siendo pobladas por un proceso sobre el cual no tengo control. Los datos se agregan sólo una vez cada mes. Esta tabla tiene que ser capaz de búsqueda de la columna Nombre. Pero la columna de nombre contiene el nombre completo en el formato 'Apellido Nombre Segundo'.

En el sphinx.conf, tengo

sql_query = SELECT Id, OwnersName,
substring_index(substring_index(OwnersName,' ',2),' ',-1) as firstname, 
substring_index(OwnersName,' ',2) as lastname
FROM table1

¿Cómo usar la búsqueda esfinge para buscar por apellido y / o apellido? Me gustaría ser capaz de buscar 'Smith' en sólo el primer nombre?

¿Fue útil?

Solución

A juzgar por las otras respuestas, que puede haber perdido algo ... pero para restringir una búsqueda en la Esfinge a un campo específico, asegúrese de que está utilizando el (o extended2) Modo de juego extendido, y luego utilizar la siguiente consulta cadena:. @firstname Smith

Otros consejos

Por funciones fila en las consultas SQL son siempre una mala idea para las tablas que pueden crecer grande. Si desea buscar en parte de una columna, debe ser extraído a su propia columna e indexado.

Yo sugeriría, si tiene poder sobre el esquema (en comparación con el proceso de llenado), la inserción de nuevas columnas llamadas OwnersFirstName y OwnersLastName junto con un activador de actualización / inserción que extrae la información relevante de OwnersName y populats las nuevas columnas apropiadamente .

Esto significa expensas de averiguar el nombre sólo se realiza cuando se cambia una fila, no cada vez de ejecutar la consulta. Ese es el momento adecuado para hacerlo.

A continuación, se convierten en sus consultas tan rápidos. Y, sí, esto rompe 3NF, pero la mayoría de la gente no se da cuenta de que está bien hacer eso por razones de rendimiento, siempre y cuando usted entienda las consecuencias. Y, puesto que las nuevas columnas son controlados por los factores desencadenantes, la duplicación de datos que sería motivo de preocupación es "limpia".

La mayoría de los problemas que las personas tienen con las bases de datos es la velocidad de sus consultas. Perder un poco de espacio en disco para obtener una gran cantidad de mejora del rendimiento es por lo general bien.

Si usted no tiene absolutamente no poder sobre el esquema, incluso, otra posibilidad es crear su propia base de datos con el esquema de "correcta" y rellenarla periódicamente a partir de la base de datos real. A continuación, consulta el suyo. Que pueden implicar una buena cantidad de transferencia de datos de cada mes, sin embargo lo que la primera opción es la mejor, si se permite.

Se puede usar subcadena para obtener las partes del campo que desea buscar, pero que se ralentizará el proceso. La consulta no se puede utilizar cualquier tipo de índice para hacer la comparación, por lo que tiene que tocar cada registro en la tabla.

Lo mejor sería no almacenar varios valores en el mismo campo, pero poner los componentes de nombre en tres campos separados. Al almacenar más de un valor en un campo que es casi siempre algunos problemas para acceder a los datos. Veo esto una y otra vez en diferentes foros ...

Este es un problrm intratable porque los nombres fulll lata contiene prefijos, sufijos, los segundos nombres y no los segundos nombres, nombres y apellidos compuestos con y sin guiones, etc. No hay manera razonable de hacer esto con el 100% de fiabilidad

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top