Mysql
 sql >> Datenbank >  >> RDS >> Mysql

php (unscharfe) Suche passend

Leider ist dies in PHP unerschwinglich teuer (hohe CPU- und Speicherauslastung). Sie können den Algorithmus jedoch sicherlich auf kleine Datensätze anwenden.

Um speziell darauf einzugehen, wie Sie einen Server-GAU erzeugen können:Einige eingebaute PHP-Funktionen bestimmen den "Abstand" zwischen Strings:levenshtein und similar_text .

Dummy-Daten:(tun so, als wären es Schlagzeilen)

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

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

An dieser Stelle $titles sollte nur ein Array von Strings sein. Erstellen Sie nun eine Matrix und vergleichen Sie jede Überschrift mit JEDER anderen Überschrift auf Ähnlichkeit. Mit anderen Worten, für 5 Schlagzeilen erhalten Sie eine 5 x 5-Matrix (25 Einträge). Hier kommt die CPU- und Speichersenke ins Spiel.

Deshalb kann diese Methode (über PHP) nicht auf Tausende von Einträgen angewendet werden. Aber wenn Sie wollten:

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

An diesem Punkt haben Sie im Grunde eine Matrix mit "Textabständen". Im Konzept (nicht in realen Daten) sieht es so aus wie in dieser Tabelle unten. Beachten Sie, dass es einen Satz von 0-Werten gibt, die diagonal verlaufen - das bedeutet, dass in der Matching-Schleife zwei identische Wörter - nun ja, identisch sind.

       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

Das eigentliche $matches-Array sieht etwa so aus (abgeschnitten):

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

    [Apples] => Array
        (
      ...

Wie auch immer, es liegt an Ihnen, (durch Experimentieren) zu bestimmen, was ein guter numerischer Entfernungs-Grenzwert am meisten entspricht - und ihn dann anzuwenden. Andernfalls informieren Sie sich über sphinx-search und verwenden Sie es - da es PHP-Bibliotheken enthält.

Orange, bist du froh, dass du danach gefragt hast?