sql >> Databasteknik >  >> RDS >> Mysql

php (fuzzy) sökmatchning

Tyvärr är det oöverkomligt dyrt att göra detta i PHP (högt CPU- och minnesutnyttjande.) Men du kan säkert tillämpa algoritmen på små datamängder.

För att specifikt utöka hur du kan skapa en serverhärdsmälta:ett par inbyggda PHP-funktioner kommer att bestämma "avstånd" mellan strängar:levenshtein och similar_text .

Dummydata:(låtsas att det är nyhetsrubriker)

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

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

Vid det här laget, $titles bör bara vara en rad strängar. Skapa nu en matris och jämför varje rubrik med VARJE annan rubrik för likheter. Med andra ord, för 5 rubriker får du en 5 x 5 matris (25 poster.) Det är där CPU- och minnessänkan går in.

Det är därför den här metoden (via PHP) inte kan tillämpas på tusentals poster. Men om du vill:

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

Vid det här laget har du i princip en matris med "textavstånd". I konceptet (inte i verkliga data) ser det ut ungefär som den här tabellen nedan. Notera hur det finns en uppsättning 0-värden som går diagonalt - det betyder att i matchningsslingan är två identiska ord - ja, identiska.

       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

Den faktiska $matches-arrayen ser ungefär ut så här (trunkerad):

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

    [Apples] => Array
        (
      ...

Hur som helst, det är upp till dig att (genom experiment) avgöra vad en bra numerisk avståndsgräns mestadels kan matcha - och sedan tillämpa den. Annars, läs upp på sphinx-search och använd den - eftersom den har PHP-bibliotek.

Orange är du glad att du frågade om detta?



  1. Få register över aktuell månad

  2. Är det möjligt att använda retur i lagrat förfarande?

  3. hur man ändrar timeout för mysql beständiga anslutningar

  4. Använda Microsoft DiskSpd för att testa ditt lagringsundersystem