2012-10-12 7 views
10

¿Cómo se puede implementar el "¿Quiso decir:" como Google lo hace en algunos search queries?Cómo integrar la funcionalidad "¿Quiso decir?" En los rieles?

PD: Estoy usando sphinx en mi producto. ¿Puede sugerirme cómo puedo implementar esto? Cualquier guía o sugerencia para algunos otros motores de búsqueda que tenga esta funcionalidad es bienvenida. estoy usando rails2.3.8, si eso ayuda

Una solución puede ser:

Hacer un diccionario de conocidos "palabras clave" o "frases", y en la acción de búsqueda si no se encuentra nada continuación, ejecute una consulta secundaria en ese diccionario. Actualice ese diccionario siempre que se cree una entrada de búsqueda, por ejemplo, una publicación de blog o nombre de usuario.

  • consulta = "supreman"

  • diccionario = [ "Superman", "Batman", "Hanuman" ...] (en la tabla DB)

  • de búsqueda (consulta)

  • si no hay resultados, entonces

búsqueda en el diccionario (donde la "palabra clave" LIKE query o "phrase" LIKE query) => "superman"

Verificar en la documentación de sphinx o solr. Podrían tener una mejor implementación de esta consulta "Me gusta" que devuelve una coincidencia%.

  • mostrar -> ¿Quiso decir "superman"?

Pero el punto es cómo hacerlo eficiente?

Respuesta

1

Creo que está buscando un algoritmo de concordancia de cadenas.

Recuerdo mislav's gist usado para levantar los errores cuando inicializó fue un poco mal escrito. Esa podría ser una buena lectura.

También, echar un vistazo a algunos de los artículos que él sugiere:

+0

no hay ninguna solución incorporado o algún complemento joya para los motores de búsqueda de texto completo? –

+0

Si tuviera que implementar esto, comenzaría por mirar ['pg_trgm'] (http://www.postgresql.org/docs/9.2/static/pgtrgm.html), ya que la mayoría de mis aplicaciones ya las uso PostgreSQL. La última vez que lo verifiqué, Sphinx no tiene una búsqueda difusa como esta, excepto por lo que indica la derivación. – willglynn

+0

Estoy usando MySQL :( –

5

Tenga una mirada en el algoritmo Damerau-Levenshtein distancia. Calcula la "distancia" entre dos cadenas y determina cuántos pasos se necesitan para transformar una cadena en otra. Cuanto menos pasos, más cerca están las dos cuerdas.

This El artículo muestra el algoritmo implementado como una función almacenada de MySQL.

El algoritmo es mucho mejor que LIKE o SOUNDEX.

Creo que Google utiliza datos de fuente colectiva en lugar de un algoritmo. es decir, si un usuario escribe abcd, hace clic en el botón Atrás y luego busca inmediatamente abd, luego establece una relación entre los dos términos de búsqueda ya que el usuario no estaba satisfecho con los resultados. Una vez que tiene una comunidad muy grande buscando, aparece el patrón.

+0

Artículo enlace devuelve 404 – chanchal118

+0

@ chanchal118 fijo –

2

Debería echar un vistazo a la teoría real de cómo Google implementa algo como esto: How to Write a Spelling Corrector.

Aunque ese artículo está escrito en Python, hay enlaces a implementaciones en otros idiomas en la parte inferior del artículo. Aquí hay un Ruby implementation.

1

Ahora un día quisiste decir que la característica se implementa en base al corrector ortográfico fonético. Cuando escribimos mal, generalmente escribimos palabras fonéticamente similares. Basado en esta idea, el corrector ortográfico fonético busca en su base de datos la palabra más similar. Los lazos de similitud se rompen usando el contexto (para una consulta de varias palabras, otras palabras también ayudan a decidir la palabra correcta) y la popularidad de la palabra. Si dos palabras están fonéticamente muy cerca de la palabra mal escrita, se elige la palabra que se ajusta al contexto y se usa con mayor frecuencia en la vida cotidiana.

1

esto está funcionando para mí:

SELECT * FROM table_name WHERE soundex(field_name) LIKE CONCAT('%', soundex('searching_element'), '%') 
+0

De todos modos podría proporcionar ejemplos de lo que coincide a partir del término de búsqueda? Buscando cosas que coincidan con los caracteres transpuestos es más probable que tire esto EG : buscando ALGP en lugar de ALPG cuando ALPG y ALFG estaban disponibles para buscar. – fyrye

Cuestiones relacionadas