sql >> Database teknologi >  >> RDS >> Mysql

php (fuzzy) søgematch

Desværre er det uoverkommeligt dyrt at gøre dette i PHP (høj CPU- og hukommelsesudnyttelse). Du kan dog helt sikkert anvende algoritmen på små datasæt.

For specifikt at uddybe, hvordan du kan skabe en servernedsmeltning:et par indbyggede PHP-funktioner bestemmer "afstand" mellem strenge:levenshtein og similar_text .

Dummy-data:(lad som om, det er nyhedsoverskrifter)

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

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

På dette tidspunkt er $titles skal bare være en række strenge. Opret nu en matrix og sammenlign hver overskrift med HVER anden overskrift for lighed. Med andre ord, for 5 overskrifter vil du få en 5 x 5 matrix (25 poster). Det er her, CPU'en og hukommelsesvasken går ind.

Det er derfor, denne metode (via PHP) ikke kan anvendes på tusindvis af poster. Men hvis du ville:

$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  );
}

På dette tidspunkt har du grundlæggende en matrix med "tekstafstande". I konceptet (ikke i rigtige data) ser det ud som denne tabel nedenfor. Bemærk, hvordan der er et sæt af 0 værdier, der går diagonalt - det betyder, at i den matchende løkke er to identiske ord - ja, identiske.

       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

Det faktiske $matches-array ser sådan ud (trunkeret):

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

    [Apples] => Array
        (
      ...

Under alle omstændigheder er det op til dig at (ved at eksperimentere) bestemme, hvad en god numerisk afstandsgrænse for det meste kan matche - og derefter anvende den. Ellers læs op på sphinx-search og brug det - da det har PHP-biblioteker.

Orange, du er glad for, at du spurgte om dette?



  1. MAX() – Find den maksimale værdi i en kolonne i MySQL

  2. Hvordan kan jeg kalde en SQL Stored Procedure ved hjælp af EntityFramework 7 og Asp.Net 5

  3. PostgreSQL Regex-ordgrænser?

  4. Sådan finder du forskellen mellem to datoer i MySQL