Foros del Web » Programando para Internet » PHP »

¿¿Es posible consultar en SQL similitudes de un valor en un campo??

Estas en el tema de ¿¿Es posible consultar en SQL similitudes de un valor en un campo?? en el foro de PHP en Foros del Web. Hola! Gracias por interesarte! mi problema es el siguiente. Tengo que buscar similitudes de un valor en un campo... por ejemplo: Si buscan "partio" me ...
  #1 (permalink)  
Antiguo 27/05/2005, 13:34
Avatar de antihem  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 227
Antigüedad: 19 años, 11 meses
Puntos: 0
Información ¿¿Es posible consultar en SQL similitudes de un valor en un campo??

Hola! Gracias por interesarte!
mi problema es el siguiente.

Tengo que buscar similitudes de un valor en un campo... por ejemplo:

Si buscan "partio" me despliegue las parecidas:

- partido
- parditos
etc..

Como lo estoy haciendo actualment es usando LIKE en mi consulta SQL.. pero no me da resultados pues si no encuentra partio en ningun campo no muestra nada, por favor, necesito de su ayuda, gracias!.

__________________
- -
:neurotico eso fue un php warning ?
creo q si... :golpeado:
  #2 (permalink)  
Antiguo 26/06/2005, 07:28
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Se me ocurre que una forma de implementarlo puede ser directamente desde el programa, operando sobre los registros consultados sin filtrar, en lugar de hacerlo directamente en una consulta sobre la base de datos usando las funciones de comparación disponibles como LIKE.

La principal desventaja de este tipo de solución es que no sería tan eficiente como lo sería en teoría una función implementada en la base de datos, aunque, cuidándose de no ejecutar consultas particularmente derrochadoras, el impacto en rendimiento puede ser mínimo.

En fin, volviendo al tema de la implementación, PHP dispone de varias funciones de manipulación de cadenas que pueden resultar de utilidad en este caso. Una de ellas es levenshtein(), función que calcula un valor conocido como "distancia Levenshtein" entre dos cadenas. En base a este valor y cierto criterio de evaluación, es posible determinar si dos palabras son semejantes o no.

El siguiente ejemplo presenta este enfoque, asumiendo que solo queremos consultar datos desde un campo determinado, y esos datos son palabras sencillas.

Código PHP:
<?php

require_once 'DB.php';  // Usando el modulo DB de PEAR


// Parametros para conectarse con la base de datos
define ('BD_HOST',        'localhost');
define ('BD_USUARIO',     'nombre_usuario');
define ('BD_CONTRASENYA''contrasenya');
define ('BD_NOMBRE',      'nombre_base_de_datos');


// Conectarse con la base de datos
$dsn BD_TIPO '://' BD_USUARIO ':' BD_CONTRASENYA '@' BD_HOST .
       
'/' BD_NOMBRE;

$db =& DB::connect ($dsn);

if (
PEAR::isError ($db)) {
    echo 
"No ha sido posible conectarse con la base de datos: " .
        
$db->getMessage ();
}

// Recibir las filas como matrices asociativas
$db->setFetchMode (DB_FETCHMODE_ASSOC);



/*************
 * Busquedas *
 *************/

$palabra 'partio';  // Palabra base para buscar semejantes


/**
 * Primer metodo, usar la funcion LIKE de la base de datos para
 * encontrar palabras similares
 **/

$resultados $db->getAll ("SELECT `campo` FROM `tabla`
                            WHERE `campo` LIKE '%{$palabra}%'"
);

echo 
"Estos son los resultados de la consulta usando LIKE:\n";
foreach (
$resultados as $fila) {
    
$semejante $fila['campo'];
    echo 
"  $semejante\n";
}



/**
 * Segundo metodo, solicitar todos los registros, y procesarlos
 * localmente con la funcion levenshtein() para encontrar palabras
 * semejantes.
 **/

// Distancia levenshtein maxima para considerar una palabra como semejante
$criterio 3;

$resultados $db->getAll ("SELECT `campo` FROM `tabla`");

$semejantes = array ();
foreach (
$resultados as $fila) {
    if (
levenshtein ($fila['campo'], $palabra) <= $criterio)
        
$semejantes[] = $fila['campo'];
}

echo 
"Estos son los resultados de la consulta usando levenshtein():\n";
foreach (
$semejantes as $semejante) {
    echo 
"  $semejante\n";
}

?>
Puede que te sirva de ayuda para construir lo que necesitas.
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 01:27.