sql >> Database >  >> RDS >> Mysql

php (fuzzy) zoekovereenkomst

Helaas is het onbetaalbaar om dit in PHP te doen (hoog CPU- en geheugengebruik). Je kunt het algoritme echter zeker toepassen op kleine datasets.

Om specifiek uit te leggen hoe je een server-meltdown kunt creëren:een paar ingebouwde PHP-functies bepalen de "afstand" tussen strings:levenshtein en similar_text .

Dummy-gegevens:(doe alsof het nieuwskoppen zijn)

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

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

Op dit moment, $titles zou gewoon een array van strings moeten zijn. Maak nu een matrix en vergelijk elke kop met ELKE andere kop voor gelijkenis. Met andere woorden, voor 5 koppen krijgt u een matrix van 5 x 5 (25 items). Dat is waar de CPU en het geheugen naar binnen gaan.

Daarom kan deze methode (via PHP) niet worden toegepast op duizenden inzendingen. Maar als je wilde:

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

Op dit punt heb je in feite een matrix met 'tekstafstanden'. In concept (niet in echte gegevens) ziet het er ongeveer uit als deze onderstaande tabel. Merk op dat er een reeks 0-waarden is die diagonaal gaan - dat betekent dat in de overeenkomende lus twee identieke woorden -- nou ja, identiek zijn.

       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

De werkelijke $matches-array ziet er ongeveer zo uit (afgekort):

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

    [Apples] => Array
        (
      ...

Hoe dan ook, het is aan jou om (door te experimenteren) te bepalen wat een goede numerieke afstandsgrenswaarde het meest overeenkomt - en deze vervolgens toe te passen. Lees anders sphinx-search en gebruik het - aangezien het PHP-bibliotheken heeft.

Orange, ben je blij dat je hiernaar hebt gevraagd?



  1. Is het mogelijk om een ​​tijdstempelkolom te definiëren die niet null is en geen standaard en geen speciaal gedrag bij de update heeft?

  2. Hoe de veldwaarde te bepalen die niet kan worden geconverteerd naar (decimaal, zwevend, int) in SQL Server

  3. Waarom worden er geen sleutels gebruikt in deze EXPLAIN?

  4. Moet ik PreparedStatements gebruiken voor al mijn database-inserts in Java?