sql >> Base de Datos >  >> RDS >> Mysql

Coincidencia de búsqueda php (difusa)

Desafortunadamente, hacer esto en PHP es prohibitivamente costoso (alta utilización de CPU y memoria). Sin embargo, ciertamente puede aplicar el algoritmo a pequeños conjuntos de datos.

Para ampliar específicamente cómo puede crear un colapso del servidor:un par de funciones PHP integradas determinarán la "distancia" entre las cadenas:levenshtein y texto_similar .

Datos ficticios:(finja que son titulares de noticias)

$titles = <<< EOF
Apple
Apples
Orange
Oranges
Banana
EOF;

$titles = explode("\n", $titles );

En este punto, $titles debería ser solo una matriz de cadenas. Ahora, crea una matriz y compara cada titular con TODOS los demás titulares para ver si hay similitudes. En otras palabras, para 5 titulares, obtendrá una matriz de 5 x 5 (25 entradas). Ahí es donde entra la CPU y el sumidero de memoria.

Es por eso que este método (a través de PHP) no se puede aplicar a miles de entradas. Pero si quisieras:

$matches = array();
foreach( $titles as $title ) {
    $matches[$title] = array();
    foreach( $titles as $compare_to ) {
        $matches[$title][$compare_to] = levenshtein( $compare_to, $title );
    }
    asort( $matches[$title], SORT_NUMERIC  );
}

En este punto, lo que básicamente tiene es una matriz con "distancias de texto". En concepto (no en datos reales) se parece a esta tabla a continuación. Tenga en cuenta que hay un conjunto de valores 0 que van en diagonal, lo que significa que en el bucle coincidente, dos palabras idénticas son... bueno, idénticas.

       Apple Apples Orange Oranges Banana
Apple    0     1      5      6       6
Apples   1     0      6      5       6
Orange   5     6      0      1       5
Oranges  6     5      1      0       5
Banana   6     6      5      5       0

La matriz real de $coincidencias se parece a esto (truncada):

Array
(
    [Apple] => Array
        (
            [Apple] => 0
            [Apples] => 1
            [Orange] => 5
            [Banana] => 6
            [Oranges] => 6
        )

    [Apples] => Array
        (
      ...

De todos modos, depende de usted (mediante la experimentación) determinar qué un buen límite numérico de distancia podría coincidir en su mayoría, y luego aplicarlo. De lo contrario, lea sphinx-search y utilícelo, ya que tiene bibliotecas PHP.

Naranja, ¿te alegra haber preguntado sobre esto?