Foros del Web » Programando para Internet » PHP »

Problema de búsqueda aplicando explode srtlen count

Estas en el tema de Problema de búsqueda aplicando explode srtlen count en el foro de PHP en Foros del Web. Buenas gente, ojalá pueda darme a entender, y ojala tenga una manita ya que no se si es o no complejo lo que requiero. Necesito ...
  #1 (permalink)  
Antiguo 04/06/2014, 21:16
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Problema de búsqueda aplicando explode srtlen count

Buenas gente, ojalá pueda darme a entender, y ojala tenga una manita ya que no se si es o no complejo lo que requiero.

Necesito crear una funcionalidad en una búsqueda. Es simple, la primera parte funciona perfecta, pero no logro hilar una segunda parte. vamos por secciones.

Cuando alguien introduce parametros para una búsqueda lo que hago es, contar cuantas palabras fueron introducidas y si es una sola, hago una búsqueda con LIKE de MYSQL... y si tiene más de 1 palabra, hago una búsqueda con MATCH AGAINST, todo tratando de optimizar mis búsquedas, y me funciona.. lo hago asi.:

Código PHP:
<?php
//recibo una variable cualqueira
$variable $_GET['var'];
//divido las palabras por espacios
$words=explode(" ",$variable);
//cuento la cantidad de palabras
$numero=count($words);

//si el numero de palabras es 1 buscamos con LIKE
if($numero == 1) {


$sql="SELECT * FROM musicas WHERE titulo LIKE '%$variable%' ";


}elseif(
$numero 1) {//si el numero de palabras mayor a 1 buscamos con MATCH


$sql="SELECT * FROM musicas WHERE MATCH (titulo) AGAINST ('$variable' IN BOOLEAN MODE)";

}
?>
Todo genial, funciona, pero, si habilita la búsqueda por MATCH AGAINST tiene un problema, que es el siguiente.

Si existiera una música llamada "EL SOL", y una persona ingresa esa misma palabra, no la va a encontrar, ya que el MATCH AGAINST solo admite búsquedas relevantes a partir de palabras con 4 caracteres. y en ambos casos, la frase "EL SOL" no cumple con esos parámetros, porque EL=2 caract. y SOL=3 caract., sin embrago el título de la música si existe así mismo en la BD.

Se me ocurrió que se puede hacer un siguiente paso, y aquí es donde necesito ayuda.

Cuando se busque una variable, contar cuantas palabras existen en la búsqueda como venía haciendo, pero si es más de 1 palabra, que primero me cuente la cantidad de caracteres que tiene cada palabra.. creo que un STRLEN puede funcionar.. ej.:

Cita:
VARIABLE = "EL SOL ARIO"
EL=2 caracteres
SOL=3 caracteres
ARIO=4 caracteres
es decir, reconocer que si en la frase insertada existe o existen palabras que tienen más de 3 caracteres, que busque sin dramas con MATCH AGAINST,

Cita:
VARIABLE = "EL MAR"
EL=2 caracteres
MAR=3 caracteres
pero si entre todas las palabras de la frase no superan los 3 caracteres que busque por LIKE pero con cada una de las palabras insertadas tipo

WHERE titulo LIKE 'EL' OR titulo LIKE 'MAR'... o con AND como nexo, no se que me convendría.

Y así dependiendo de cada palabra insertada... eso es lo que no se me ocurre como puedo lograr.

Me podrían dar una idea, o ayudarme a armar la rutina con lo que ya tengo... gracias, y atento ante cualquier consulta
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...

Última edición por loncho_rojas; 04/06/2014 a las 21:23
  #2 (permalink)  
Antiguo 04/06/2014, 21:23
 
Fecha de Ingreso: enero-2011
Ubicación: /root
Mensajes: 530
Antigüedad: 13 años, 3 meses
Puntos: 61
Respuesta: Problema de búsqueda aplicando explode srtlen count

Podrias usar algo como la distancia levensthein para realizar tus busuqedas:

http://es.wikipedia.org/wiki/Distancia_de_Levenshtein

http://php.net/manual/es/function.levenshtein.php
  #3 (permalink)  
Antiguo 04/06/2014, 21:40
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Problema de búsqueda aplicando explode srtlen count

Matt... no estas entendiendo... para que el levensthein funcione optimamente, necesito tener una librería de palabras depuradas y de ahí hago el levensthein en el caso que NO EXISTAN RESULTADOS o porque se escribió mal, pero en lo que yo expongo es que la frase SI EXISTE y no está mal escrita, pero la limitación del MATCH AGAINST hace que no sea relevante para él.. y saber que buscar frases con mas de 1 palabra con LIKE ya no traen optimizados los resultados que necesito.. por eso quiero desglozar.

Usar levensthein sin una lista depurada, no me resulta optimo...

¿Te parece que el usuario escriba "EL SOL" y le diga, NO EXISTEN RESULTADOS, TAL VEZ QUISISTE DECIR "EL SOL" ?
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #4 (permalink)  
Antiguo 04/06/2014, 22:09
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema de búsqueda aplicando explode srtlen count

Quizá haya una forma más eficiente de hacer esto, pero lo que buscas hacer, lo haría de este modo:

Código PHP:
Ver original
  1. $variable = 'El sol ario';
  2. $desgloza = explode(' ', $variable);
  3. $comodin = false;
  4.  
  5. foreach ($desgloza as $palabra)
  6.     if (strlen($palabra) > 3) $comodin = true;
  7.    
  8. if ($comodin)
  9.     $query = "SELECT * FROM tabla WHERE MATCH (campo) AGAINST ('$variable' IN BOOLEAN MODE)";
  10. else
  11.     $query = "SELECT * FROM tabla WHERE campo LIKE '%" . implode("%' OR campo LIKE '%", $desgloza) . "%'";

El resultado de este ejemplo, es el siguiente:

Código MySQL:
Ver original
  1. SELECT * FROM tabla WHERE MATCH (campo) AGAINST ('El sol ario' IN BOOLEAN MODE)

Sin embargo, si $variable tuviera por valor "El sol", el resultado variaría:

Código MySQL:
Ver original
  1. SELECT * FROM tabla WHERE campo LIKE '%El%' OR campo LIKE '%sol%'

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 04/06/2014 a las 22:16 Razón: Fe de erratas
  #5 (permalink)  
Antiguo 04/06/2014, 22:18
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Problema de búsqueda aplicando explode srtlen count

Que tal Alexis88, gracias, voy a probarlo y ver que tal funciona... y comento.
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...

Etiquetas: count, explode, mysql, select, sql, variable
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 14:39.