levenshtein
Hallo allerseits,
ich würd gern wissen wie man ein MySQL- Result so sortieren kann, dass es nach der Ähnlichkeit zu dem, was ich eingegeben habe sortiert wird. Also wenn ich in das Suchfeld zum Beispiel "in" eingebe, soll er mir an erster Stelle auch "in" zeigen und nicht zum Beispiel "eins".
Dachte daher, dass man das so ähnlich lösen könnte:
foreach ($words as $word) {
$lev = levenshtein($input, $word);
}
$query = "SELECT deutsch FROM words WHERE deutsch like '%".$search."%' order by ".$lev."";
$resultID = @mysql_query($query);
Aber so einfach gehts wohl nicht. Kann mir jemand helfen?
Danke
Üsch
Antwort schreiben
Antwort 1 von Uesch vom 13.07.2019, 12:45 Options
Weiß niemand wie man das machen könnte?
Antwort 2 von Proggi vom 13.07.2019, 12:51 Options
da SQL die funktion levenshtein nicht kennt wird das etwas hakelig... Du müstest entweder eine SQL-Funktion für Levenstein bekommen (vielleicht gibts das ja doch irgendwo) oder alle selektieren und dann mit der PHP-Funktion
if (levenshtein(§str1,$Str2) < 99) {
selber ausfiltern...
davon rate ich aber ab da das wohl vielleicht den SQL-Server sehr belastet und langsam ist, wenn große mengen an daten überprüft werden.
Antwort 3 von disco vom 13.07.2019, 12:53 Options
moin
du solltest dir mal überlegen welche (un)logik dahintersteht, bzw. musst du genau wissen, wie dir ordnung aussehen soll..
wenn vorne erstmal die hits stehen sollen, wo der suchbegriff den anfang des wortes bildet, dann zieh diese doch aus dem ergebnis und sortiere es alphabetisch.
danach listest du den übrig gebliebenen rest auf.
g,
disco
Antwort 5 von Proggi vom 13.07.2019, 14:48 Options
also mit levenstein hat das bei denne auch nichts zu tun, die suchen scheinbar auch mit like '%Begriff%'
denn Schauspiele hört sich für mich nicht ähnlich wie Haus an...
Antwort 6 von Proggi vom 13.07.2019, 14:51 Options
aso.. order by alles klar ^^ naja, ich glaube die Sortierung machen die aber wirklich dann über levenstein nur das die das in dem PHP-Script machen. Die suche filtert vorher normal mit "like" um die anzahl der Treffer einzugrenzen...
dafür gibts Array-funktionen, erstelle ein mehrdimensionales array wo du Deutscher begriff, Lateinischer begriff und Levensteinwert einträgst. Dann sortierst du das Array nach dem Levensteinwert und gibst es aus. Für den Levensteinvergleich mache die "Fett-schrifft" für den Suchbegriff am besten erst bei der Ausgabe rein.
Antwort 7 von Uesch vom 13.07.2019, 16:11 Options
Danke erstmal,
habs jetzt so:
$query = "SELECT id,deutsch,griechisch FROM ".$table
." WHERE deutsch like '%".$search."%' or griechisch like '%".$search."%' order by deutsch LIMIT ".$start.",".$limit;
$resultID = @mysql_query($query);
while ($data = mysql_fetch_array($resultID))
{
$lev = levenshtein($search, $data["deutsch"]);
$array = array($data["deutsch"], $data["griechisch"], $lev);
array_multisort ($array[$lev], SORT_ASC, SORT_NUMERIC);
Da gibt er mir aber folgende Fehlermeldung:
Argument #1 is expected to be an array or a sort flag
Das mit dem $array[$lev] geht wahrscheinlich nicht, ne?
Oder muss man den Array mit array_push machen?