05-09-2025

Búsqueda fuzzy en php: cómo implementarla

La búsqueda Fuzzy en php permite encontrar coincidencias en cadenas de texto incluso si hay errores tipográficos, variaciones o diferencias menores. A continuación, se explica cómo implementar un buscador Fuzzy en PHP, destacando las opciones más comunes y prácticas, con ejemplos de código.

Opciones para implementar un buscador fuzzy en php

  1. Distancia Levenshtein: calcula la "distancia de edición" entre dos cadenas. Ejemplo:

    $input = "kitten";
    $database = ["sitting", "kitchen", "kitten", "kit"];
    
    $results = [];
    foreach ($database as $word) {
    $distance = levenshtein($input, $word);
    if ($distance <= 2) { // Umbral de distancia
    $results[] = [$word, $distance];
    }
    }
    
    // Ordenar por distancia
    usort($results, function($a, $b) {
    return $a[1] <=> $b[1];
    });
    var_dump($results);
    //Salida
    Array (
    [0] => Array ( [0] => kitten [1] => 0 )
    [1] => Array ( [0] => kitchen [1] => 1 )
    [2] => Array ( [0] => sitting [1] => 2 )
    )
    
  2. Similar Text: La función calcula el porcentaje de similitud entre dos cadenas. Es fácil de usar, y es ideal para comparar frases más largas. Pero es menos preciso que distancia Levenshtein para coincidencias exactas. Ejemplo:

    $input = "hummingbird";
    $database = ["ummingbird", "hummingbird", "hummingbir", "bird"];
    
    $results = [];
    foreach ($database as $word) {
    similar_text($input, $word, $percent);
    if ($percent > 80) { // Umbral de similitud
    $results[] = [$word, $percent];
    }
    }
    
    usort($results, function($a, $b) {
    return $b[1] <=> $a[1]; // Ordenar de mayor a menor similitud
    });
    
    var_dump($results);
    //Salida
    Array (
    [0] => Array ( [0] => hummingbird [1] => 100 )
    [1] => Array ( [0] => ummingbird [1] => 90.909090909091 )
    [2] => Array ( [0] => hummingbir [1] => 90 )
    )
    
  3. Librerías de terceros:
    • Fuse.php: Una librería PHP que es un puerto de Fuse.js (JavaScript). Es ideal para búsquedas fuzzy en arrays de datos complejos.
    • FuzzyWuzzy: Basada en la librería Python del mismo nombre, ofrece métodos como ratio, partialRatio, y tokenSortRatio.
    • SimpleFuzzySearch: Una solución ligera para buscar en arrays asociativos.

Mejores prácticas

  • Umbral de similitud: Ajusta el umbral (ej. distancia Levenshtein ≤ 2 o similitud > 80%) según tus necesidades.
  • Optimización: Para grandes conjuntos de datos, considera indexar palabras clave o usar una base de datos optimizada (como Elasticsearch o Manticore Search) en lugar de recorrer arrays en PHP.
  • Preprocesamiento: Normaliza las cadenas (minúsculas, eliminar acentos) antes de comparar.
  • Aprendizaje: Registra las búsquedas de los usuarios para mejorar los resultados con el tiempo.

Recomendaciones

  • Para proyectos pequeños es mejor usar levenshtein() o similar_text().
  • Para proyectos medianos: Prueba Fuse.php o FuzzyWuzzy para mayor flexibilidad.
  • Para aplicaciones grandes: Integra TNTSearch o una solución externa como Elasticsearch.
Os recomiendo el post de búsqueda Fuzzy en mysql