2011-12-06 14 views
6

tengo una tabla mySQL donde la gente agrega sus nombres y sus intereses. Quiero usar algún tipo de coincidencia de palabras que se realice y encuentre una coincidencia del 100% o una coincidencia cercana. He oído hablar de la distancia levenshtein, pero no tengo idea de cómo hacer que pase por mi mesa.Concordancia exacta de la palabra de búsqueda posiblemente usando la distancia de Levenshtein

$input = $_POST["interest"]; 
    $result = mysql_query("SELECT interest_desc FROM interests"); 

hecho algunas google y llegó a este punto

function closest($seed, $haystack){ 
    $shortest = -1; 
    foreach ($haystack as $word){ 
     $lev = levenshtein($seed, $word); 
     if ($lev == 0) { 
      $closest = $word; $shortest = 0; break; 
     } 
     if ($lev <= $shortest || $shortest < 0) { 
     $closest = $word; $shortest = $lev; 
     } 
} 
return $closest; 
} 
$array = mysql_fetch_row($result); 
$closestmatch = closest($input,$array); 
echo $closetmatch; 
+0

¿Estás seguro de que definitivamente quieres hacer esto en PHP? Si desea buscar coincidencias (o cerrar coincidencias), esto es algo que se maneja correctamente en el extremo de DB. Por favor déjanos saber. – rdlowrey

+0

como dice @rdlowery, es mejor que transfiera la responsabilidad a MySQL: lea http://stackoverflow.com/questions/634995/implementation-of-levenshtein-distance-for-mysql-fuzzy-search y http://www.artfulsoftware.com/infotree/queries.php#552 para una solución ... – HorusKol

Respuesta

0

Creo que el uso de PHP para hacer esto es el enfoque incorrecto, MySQL puede hacer con facilidad y eficacia esto. No estoy seguro de cómo es toda la estructura de su esquema, pero podría simplemente hacer un PROCEDURE en MySQL con los parámetros de búsqueda y simplemente llamarlo desde PHP.

  1. Hacer algo similar a esto en MySQL:

    - Crear proc con el parámetro de búsqueda CREAR sp_SearchInterests PROCEDIMIENTO (EN p_SearchParam VARCHAR (30)); DELIMITER //

    interest_desc SELECT FROM intereses DONDE interest_desc = p_SearchParam O interest_desc LIKE '% pSearchParam%' //

    FIN; DELIMITER;

  2. De PHP solo CALL sp_SearchInterests('whateveryouwant') para devolver los resultados deseados.

+0

de manera fácil y eficiente? Normalmente eso se opone a "usar procedimientos almacenados". Porque son ... simplemente malo en MySQL. Además, en 90% de los casos, si la intención es usar código almacenado, entonces es hora de pensar si ese código se debe mover a _application_. Finalmente, el código anterior no tiene nada que ver con la distancia de Levenshtein –

+0

Punto de referencia Re: distancia de Levenshtein. Aunque el proceso anterior funcionará súper rápido si eso es todo lo que intenta hacer, creo que Levenshtein puede ser excesivo. – Phrancis

Cuestiones relacionadas