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
- 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 )
)
- 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 )
)
- 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
$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 )
)
$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 )
)
- 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.
- FuzzyWuzzy: Basada en la librería Python del mismo nombre, ofrece métodos como ratio, partialRatio, y tokenSortRatio.
- 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.