Ver Mensaje Individual
  #2 (permalink)  
Antiguo 26/06/2005, 07:28
leonardop
 
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.