Estoy tratando de encontrar la forma más rápida de hacer sugerencias de búsqueda. Al principio, pensé que una función Levenstein UDF combinada con una tabla mysql haría el trabajo. Pero al usar levenshtein, mysql tendría que repasar cada fila de la tabla (toneladas de palabras) lo que haría que la consulta sea realmente lenta.Sphinx y "¿quisiste decir ...?" idea de sugerencias. ¿Funcionará?
Ahora recientemente instalé y comencé a usar Sphinx (http://sphinxsearch.com/) para búsqueda de texto completo principalmente por su rendimiento y la estrecha integración de MySQL con SphinxSE.
Así que me pregunté si puedo implementar un algoritmo de "quise decir" usando sphinx para mejorar el rendimiento de alguna manera, y creo que encontré uno simple. Básicamente tomo todas las palabras clave que quiero corregir, pongo un espacio entre cada letra, luego lo pongo en el índice esfinge. Si la palabra es 'palabra clave' se convierte en 'k e y w o r d'. Ahora, cuando el usuario ingresa una palabra, la divido en letras y busca en el índice de la esfinge un registro (solo necesito uno) que coincida con cualquiera de las letras provistas. La mejor parte es que esfinge es muy bueno para calcular la relevancia (peso) de las filas coincidentes, por lo que la mejor coincidencia siempre tendrá el mayor peso (creo). También representa las posiciones de palabra (letras en mi caso) para que la mejor coincidencia sea en ese orden.
Con la consulta de sphinx obtengo la palabra más similar en mi lista de palabras clave. Luego lo verifico con php usando la distancia extendida de Levenshtain que da cuenta de las letras reorganizadas http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance. Si la distancia de la cuerda es menor que 2 (y! = 0) sugerir la palabra. De lo contrario, no sugiera nada.
¿Hay algún problema con mi idea? ¿Algo en lo que no pensé? ¿Algún error técnico esperado con la consulta de la esfinge, y caprichos con el cálculo de la relevancia de la esfinge que no daría la mejor combinación? Por favor corrígeme si me equivoco en alguna parte.
Gracias, lo investigaré más a fondo cuando tenga tiempo. – stormbreaker