¿Hay alguna manera de buscar en la base de datos MySQL palabras similares (significa palabras no idénticas). Por ejemplo: el usuario busca en la base de datos la palabra "abcd" y hay una palabra "abd" en la base de datos para que el motor de búsqueda o el programa pregunte al usuario "¿Quiere decir [abd]?" Como en la mayoría de los motores de búsqueda en el web? Tenga en cuenta que el término de búsqueda no es una parte de la palabra existente (no se puede utilizar "como")¿Hay alguna forma de buscar en la base de datos SQL palabras similares (significa palabras no idénticas)?
Respuesta
Echa un vistazo al algoritmo Damerau-Levenshtein distance. 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.
depende de lo lejos que están, usted podría mirar en soundex quizá ..
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex
gran eslabón muchas gracias – EgyEast
Echa un vistazo Levenshtein_distance
Otra técnica es crear índices en trigrams.
Desde el enlace en la respuesta de Dave Barker está muerto, aquí está el código de an archived version of the website:
CREATE FUNCTION LEVENSHTEIN (s1 VARCHAR(255), s2 VARCHAR(255)) RETURNS INT DETERMINISTIC BEGIN DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT; DECLARE s1_char CHAR; DECLARE cv0, cv1 VARBINARY(256); SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0; IF s1 = s2 THEN RETURN 0; ELSEIF s1_len = 0 THEN RETURN s2_len; ELSEIF s2_len = 0 THEN RETURN s1_len; ELSE WHILE j <= s2_len DO SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1; END WHILE; WHILE i <= s1_len DO SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1; WHILE j <= s2_len DO SET c = c + 1; IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF; SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost; IF c > c_temp THEN SET c = c_temp; END IF; SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1; IF c > c_temp THEN SET c = c_temp; END IF; SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1; END WHILE; SET cv1 = cv0, i = i + 1; END WHILE; END IF; RETURN c; END
Tomar nota:
La duración máxima de las cadenas de entrada es de 255 caracteres. Estoy seguro de que podría editar la función para admitir más si es necesario.
Lo he probado con caracteres internacionales en una columna utf8_bin y parecía funcionar, pero no he probado esa capacidad exhaustivamente.
Solo lo he probado en MySQL 5.0+. No tengo idea de cómo funcionará en versiones inferiores a eso.
Y como un bono También creé una función auxiliar que devuelve la relación (en porcentaje) de diferente: los mismos caracteres que pueden ser más útil que una distancia de edición recta (idea de aquí).
CREATE FUNCTION LEVENSHTEIN_RATIO (s1 VARCHAR(255), s2 VARCHAR(255)) RETURNS INT DETERMINISTIC BEGIN DECLARE s1_len, s2_len, max_len INT; SET s1_len = LENGTH(s1), s2_len = LENGTH(s2); IF s1_len > s2_len THEN SET max_len = s1_len; ELSE SET max_len = s2_len; END IF; RETURN ROUND((1 - LEVENSHTEIN(s1, s2)/max_len) * 100); END
- 1. Solr Fuzzy Buscar palabras similares
- 2. palabras uso base de datos?
- 3. Buscar las primeras 4 palabras y las últimas 4 palabras de la base de datos después de palabras clave particulares?
- 4. Buscando palabras similares
- 5. ¿Hay alguna forma de filtrar las palabras ofensivas de Jcaptcha?
- 6. ¿Hay palabras reservadas en SQLite?
- 7. ¿Cómo obtener la base de datos de palabras en inglés?
- 8. buscar palabras parciales utilizando Solr
- 9. cómo guardar etiquetas (palabras clave) en la base de datos?
- 10. Detener la división de palabras entre palabras
- 11. base de datos MySQL de palabras en inglés?
- 12. Base de datos de búsqueda de palabras ofensivas
- 13. Buscar anagaram (s) de palabras del diccionario
- 14. Buscar y reemplazar palabras en HTML
- 15. Buscar y reemplazar palabras completas (no subcadenas) en Emacs
- 16. ¿Hay alguna manera de agrupar palabras largas en un div?
- 17. Comparar palabras, también hay que buscar plurales e ing?
- 18. ¿Existe alguna forma programática para identificar palabras reservadas de C#?
- 19. Solr: ¿hay alguna manera de incluir palabras vacías al buscar frases exactas?
- 20. ¿Cómo buscar palabras completas en vim?
- 21. ¿Hay alguna manera en SQL Server de identificar de forma exclusiva una base de datos?
- 22. ¿palabras clave SQL estándar?
- 23. Buscar y reemplazar palabras completas en vim
- 24. Creación de nombres de tabla que son palabras reservadas/palabras clave en MS SQL Server
- 25. PostgreSQL: Búsqueda de texto completo - ¿Cómo buscar palabras parciales?
- 26. Encontrar filas similares en la base de datos
- 27. ¿Hay alguna forma de consolidar enlaces de datos y/o disparadores similares en XAML?
- 28. Algoritmo de búsqueda de palabras
- 29. C# Constructor de palabras clave de base
- 30. Encuentra palabras y combinaciones de palabras que se pueden expresar de la forma más rápida
Gracias, me ha ayudado mucho – EgyEast