5

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.

Respuesta

3

no puedo ver una problema con tu idea Ve a por ello. Solo para señalar que su método solo es relevante si desea anular el comportamiento incorporado que es muy similar a LD.

Por ejemplo, con sphinx 1.10-beta, puede especificar min_infix_len y expand_keywords y usar los métodos de ponderación incorporados de esfinge (BM25 y algunos códigos de propiedad) para obtener buenos resultados. http://sphinxsearch.com/blog/2010/08/17/how-sphinx-relevance-ranking-works/

No olvides realizar una Memcache de estas consultas y crear una secuencia de comandos de preparación.

+0

Gracias, lo investigaré más a fondo cuando tenga tiempo. – stormbreaker

0

Creo que va a ser interesante para usted leer lo que piensa Andrew Aksyonoff (autor de la esfinge) sobre la ejecución de esta tarea a través de Sphinx - http://habrahabr.ru/blogs/sphinx/61807/ (traductor uso de traducir del ruso)

+0

Lo leí, mi pregunta era si mi idea funcionaría como esperaba o si había algo por lo que no tenía en cuenta.(Por cierto, tengo un conocimiento básico del ruso, así que no necesito un traductor) :) – stormbreaker

0

Puede registrar todas las consultas de búsqueda ingresadas, junto con una consulta de búsqueda siguiente que el usuario ingrese.

Supongamos que muchos usuarios buscan rinocerontes pero en realidad significan rinocerontes. Debido a que los usuarios corregirán su consulta, esto significará que habrá muchas consultas rhinosorosas con rinocerontes como la próxima consulta.

Puede seleccionar las sugerencias de esta manera:

SELECT id, query, next_query, COUNT(id) AS count FROM queries GROUP BY query ORDER BY COUNT(id) DESC 

Si el resultado superior tiene una count que un alto% de todas las consultas para esa palabra clave, mostrará un mensaje.

No lo he probado, es solo una idea.

Cuestiones relacionadas