Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Problemas buscando palabras completas en MySQL

Estas en el tema de Problemas buscando palabras completas en MySQL en el foro de Bases de Datos General en Foros del Web. Tengo una base de datos con una tabla y dos campos (producto, descripción) Quiero hacer una busqueda por palabras completas en el campo descripción esto ...
  #1 (permalink)  
Antiguo 10/09/2004, 01:06
 
Fecha de Ingreso: septiembre-2004
Mensajes: 21
Antigüedad: 19 años, 7 meses
Puntos: 0
Problemas buscando palabras completas en MySQL

Tengo una base de datos con una tabla y dos campos (producto, descripción)

Quiero hacer una busqueda por palabras completas en el campo descripción esto es, que si la descripción en dos registros es.

"Esto tiene mucho amor" y "Esto es muy amoroso"

y yo busco "amor" solo tengo que obtener el primer registro, y no el segundo porque el texto "amor" en el segundo es un trozo de una palabra, no la palabra completa.

Para eso he encontrado dos soluciones en el manual MySQL:
1) busqueda por expresiones regulares con REGEXP '[[:<:]]palabra[[:>:]]'
2) busqueda con MATCH...AGAINST

El problema que tengo en ambos casos es que las palabras con acentos y con la letra ñ me dan resultados indeseados, por ejemplo supongamos el registro: "pétalo de la flor"

Si busco la palabra "talo" obtengo resultado positivo porque MySQL interpreta "é" como caracter separador de palabras.
Si busco "petalo" resultado negativo porque no he puesto el acento
Si busco "pétalo" resultado positivo porque si he puesto el acento

Con la ñ sucede parecido

¿Hay alguna forma de solucionar esto?

¿Hay alguna manera directa para evitar el problema de los acentos y la ñ?
¿Cómo puedo indicar a MySQL que la ñ es un caracter válido, que la á se comporte como a, la é como e, etc?
  #2 (permalink)  
Antiguo 11/09/2004, 06:28
Avatar de Edypu  
Fecha de Ingreso: octubre-2003
Ubicación: La Paz - Bolivia
Mensajes: 394
Antigüedad: 20 años, 6 meses
Puntos: 1
Creo que te estas enrredando mucho usa el "LIKE" en tu select


Saludos
  #3 (permalink)  
Antiguo 12/09/2004, 09:24
 
Fecha de Ingreso: septiembre-2004
Mensajes: 21
Antigüedad: 19 años, 7 meses
Puntos: 0
Gracias por tu respuesta.

Deseché el uso de LIKE porque no me proporcionaba palabras completas con una sintaxis sencilla (o al menos no supe como hacerlo).

Quizas tu estás pensando en algo distinto. ¿Podrías ponerme un ejemplo de como lo harías tu con LIKE?
  #4 (permalink)  
Antiguo 12/09/2004, 11:05
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Hola!

La expresiones regualres en mysql son muy potentes, y te permiten un mejor control sobre las búsquedas que realizas
Para evitar el error con los acentos y las "ñ" puedes probar con la funcion SOUNDEX de mysql
mas informacion la encuentras en:
http://dev.mysql.com/doc/mysql/en/String_functions.html

aqui encuentras un ejemplo práctico
http://www.programacion.com/bbdd/codigo/118/
donde se cita
Cita:
SELECT *
FROM EMPLEADO
WHERE SOUNDEX(APELLIDOP)=SOUNDEX(\'Peréz)

Esta función nos ayuda a seleccionar datos por su fonética, en concreto como se pronuncia la cadena.
En este ejemplo queremos saber los datos de todos los empleados PEREZ, entonces obtendremos un resultado como por ejemplo: Pérez, Perez,Peres,PEREZ.
Saludos
  #5 (permalink)  
Antiguo 13/09/2004, 00:44
 
Fecha de Ingreso: septiembre-2004
Mensajes: 21
Antigüedad: 19 años, 7 meses
Puntos: 0
Gracias, probaré soundex a ver que pasa.
  #6 (permalink)  
Antiguo 13/09/2004, 08:35
 
Fecha de Ingreso: septiembre-2004
Mensajes: 21
Antigüedad: 19 años, 7 meses
Puntos: 0
Q

Soundex no me sirve.

Quizá el problema pueda resolverse con COLLATE ya que parece que teniendo COLLATION en el adecuado character set (en este caso latin1_spanish_ci) parece que se resolvería el problema.

Sin embargo no se bien como funciona y tengo problemas.
Con MySQL 4.1 puedo crear una base de datos con la tabla en COLLATION latin1_spanish_ci, sin embargo al hacer una consulta sigue distinguiendo los acentos y tomandolos como caracteres separadores de palabras. Puede que el problema sea que la consulta utiliza el COLLATION por defecto, que es latin1_swedish_ci, o que esto no sirva para nada, no se. Además la versión de mysql del servidor real donde irá todo es inferior a la 4.1 y no me reconoce COLLATE.

¿Alguna idea?
  #7 (permalink)  
Antiguo 13/09/2004, 08:59
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 meses
Puntos: 0
Vale quizas sea una tonteria pero si a la variable de la palabra buscada le añades un caracter de espacio " " tal que asi en teoria te tendria que buscar toda la cadena de la palabra mas el espacio por lo tanto solo la palabra completa. Es una idea, puedo que no chute 100% (especialmente si la palabra es la ultima, pero ahi mete el espacio antes, haz un select distinct y pon un where condicion1 OR condicion2). Simple y sencillo.
__________________
LADRONES
  #8 (permalink)  
Antiguo 13/09/2004, 09:39
 
Fecha de Ingreso: septiembre-2004
Mensajes: 21
Antigüedad: 19 años, 7 meses
Puntos: 0
Cita:
Iniciado por Txukie
Vale quizas sea una tonteria pero si a la variable de la palabra buscada le añades un caracter de espacio " " tal que asi en teoria te tendria que buscar toda la cadena de la palabra mas el espacio por lo tanto solo la palabra completa. Es una idea, puedo que no chute 100% (especialmente si la palabra es la ultima, pero ahi mete el espacio antes, haz un select distinct y pon un where condicion1 OR condicion2). Simple y sencillo.
Gracias por tu respuesta.

El problema es que existen un monton de separadores (coma, dospuntos, punto, espacio, barras, etc) y me va a quedar un churro de sentencia. Y voy a seguir teniendo el problema de que si pongo "jose" tiene que proporcionarme tanto "josé" como "jose" y no "mariajosé". Creo que REGEXP o MATCH...AGAINST es más sencillo que todo eso, excepto por la cuestion de los acentos y la ñ.
  #9 (permalink)  
Antiguo 13/09/2004, 10:40
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Podrias poner como haces la consulta a la BD, para poder ver como estas usando el SOUNDEX

Última edición por Genetix; 13/09/2004 a las 11:13
  #10 (permalink)  
Antiguo 13/09/2004, 11:07
 
Fecha de Ingreso: septiembre-2004
Mensajes: 21
Antigüedad: 19 años, 7 meses
Puntos: 0
Cita:
Iniciado por Genetix
Podrias poner el como haces la consulta a la BD, para poder ver como estas usando el SOUNDEX
Exáctamente como el ejemplo que me has puesto, el problema es que solo me saca registros completos, no palabras sueltas.

Ej: si busco "pérez"

"hola soy pérez" no lo saca
"pérez" si lo saca

si busco "hola" no me saca ninguno de los dos

si busco "hola soy pérez" me saca "hola soy pérez"

Necesito buscar palabras sueltas, por eso no me sirve.
  #11 (permalink)  
Antiguo 13/09/2004, 11:18
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
yo creo que el problema no es con el SOUNDEX si no como estas usando las expresiones regulares REGEXP
aqui tienes el manual completo del REGEXP
http://dev.mysql.com/doc/mysql/en/Regexp.html
Saludos!
  #12 (permalink)  
Antiguo 13/09/2004, 11:27
 
Fecha de Ingreso: septiembre-2004
Mensajes: 21
Antigüedad: 19 años, 7 meses
Puntos: 0
¿Te refieres a usar SOUNDEX y REGEXP a la vez? No se como.

Uso las expresiones regulares como dice el manual que hay que hacerlo para buscar palabras sueltas:

SELECT * FROM TABLA WHERE CAMPO REGEXP '[[:<:]]palabra[[:>:]]'

¿Es posible utilizar REGEXP y SOUNDEX a la vez?
  #13 (permalink)  
Antiguo 10/06/2011, 10:29
 
Fecha de Ingreso: junio-2011
Mensajes: 1
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Problemas buscando palabras completas en MySQL

Si tuvieras que usar necesariamente REGEXP y no SOUNDEX realiza lo siguiente:

SELECT * FROM TABLA WHERE CAMPO REGEXP '[[:<:]]palabra[[:>:]]'

SELECT * FROM TABLA WHERE CAMPO REGEXP '[[:<:]]p[a|á]l[a|á]br[a|á][[:>:]]'

Es decir sustituye cada vocal por

[a|á]
[e|é]
[i|í]
[o|ó]
[u|ú]

Porque no sabes donde vendra el acento.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:37.