2010-10-20 4 views
7

¿Hay alguna forma de obtener resultados de orden MySQL por lo cerca que 'suenan' a un término de búsqueda?Ordenar por Soundex (o similar) `Cercanía`

Estoy tratando de ordenar campos que contengan entradas de usuarios de nombres de ciudades. Existen variaciones y errores ortográficos, y me gustaría mostrar las coincidencias "más cercanas" en la parte superior.

Sé que soundex puede no ser el mejor algoritmo para esto, pero si (u otro método) podría tener un éxito razonable, puede valer la pena que la base de datos realice la clasificación.

Respuesta

4

Soundex no es bueno para este tipo de cosas porque las diferentes palabras pueden darle los mismos resultados de Soundex y, por lo tanto, se ordenarán arbitrariamente. Una mejor solución para esto es el algoritmo Levenshein Edit Distance y puede implementarlo como una función en su base de datos: ¡Enlace al Levensheint impl. as MySql stored function!

También puede consultar este SO link. Contiene una implementación del algoritmo de servidor Sql (T-SQL-specific), pero debería ser posible realizar un puerto. La mecánica del algoritmo es bastante simple y solo necesita una matriz 2D y un bucle sobre la cuerda.

+0

Estaba mirando a Levenshtein si tenía que hacer la clasificación en el código. Parece que pesa implementar el algoritmo * correcto * en la base de datos, o usar el mismo algoritmo que ya está disponible en el lado del código. –

+0

Si lo implementa como una función MySql (enlace en respuesta), entonces debería poder hacerlo en su SQL. Algo así como: SELECCIONAR CityName, Leven (CityName, compString) FROM City ORDER BY Leven (CityName, compString) –

+0

@Rinzler: Sí, esta publicación tiene casi dos años. Los enlaces desaparecen En cualquier caso, encontré otro ejemplo de implementación MySql y volví a vincular. –