• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

MySQL + Match + Änlichkeitsfaktor

T

ToM80

Guest
Moin, ich versuche bei einer Datenbankabfrage auch Schreibfehler abzufangen um ein Fuzzy-Search zu schreiben.
Hierfür habe ich folgende Abfrage geschrieben:
PHP:
$query="SELECT * MATCH (manufactorName) AGAINST ('".$manToCheck."') AS AF FROM `".$dbName."`.`".$tblName."` WHERE MATCH (manufactorName) AGAINST ('".$manToCheck."') HAVING AF > 0.5 ORDER BY AF";

Hier kommt folgender Fehler:
Code:
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MATCH (manufactorName) AGAINST ('Meyer') AS AF FROM `baseData_industry`.' at line 1

Wo liegt mein Fehler?
 
Zuletzt bearbeitet von einem Moderator:
mysql habe ich bereits durchforstet und nichts brauchbares gefunden.
 
Dann gibt es zwar keine Fehlermeldung mehr aber er tut auch nicht das was er tun soll *grmpf*
 
Ich hab das ganze aus dem MySql Buch von M. Kannengießer (PHP 5 / MySQL 5 - Google Bcher)

Grund warum es auch vorne steht soll der Ähnlichkeitsfaktor sein. Match läuft an sich als Volltextsuche, also der Begriff 1:1 das fordere Match sollte eigentlich eine gewollte unschärfe Implementieren. Dies klappt aber wie zu sehen nicht.

Mir ist wichtig, dass ich Meyer auch dann finde wenn Myeer geschrieben wird, hier versagt leider auch SOUNDEX().
 
Also ich hab' mich jetzt mal schlau gemacht und keinen Hinweis auf eine Ähnlichkeitssuche gefunden - das muss schon komplett passen (außer Groß- und Kleinschreibung). Ansonsten sollte jetzt alles passen.
 
Also ich hab' mich jetzt mal schlau gemacht und keinen Hinweis auf eine Ähnlichkeitssuche gefunden - das muss schon komplett passen (außer Groß- und Kleinschreibung). Ansonsten sollte jetzt alles passen.

Ja das war auch das einzige was ich finden konnte. Aber der Kannengießer ist eigentlich sonst sehr verlässlich und das Script hat er auch bereits im MySQL4 Buch gehabt und ohne Änderung ins 5er übernommen, das muss doch laufen *grml*

Alternativ: Wie könnte man eine Fuzzy-Search sonst abdecken um Vertipper rauszubekommen? Z. B. wie bei Google: Eingabe hotle Ausgabe: Meinten Sie hotel?
 
Hmm ich werde vorerstmal die Levenshtein Methode hernehmen. Um nicht ganz abwegiges zu Zeigen verbinde ich diese mit similar_text. Leider läuft das ganze nun auf PHP Level und nicht schon in der Datenbank, aber ok fürs erste sollte es reichen.

Hier der Code:
PHP:
//Levenstein Funkion
function useLevenshtein($string1,$stringArr) {
	$stringArr=explode('|#|',$stringArr);
	$shortest=-1;
	foreach ($stringArr as $string2) {
		$lev=levenshtein($string1,$string2);
		if ($lev==0) {
			$closest=$string2;
			$shortest=0;
			break;				
		}
		if ($lev<=$shortest || $shortest<0) {
			$closest=$string2;
			$shortest=$lev;
		}
	}
	return $closest;
}

//Andere Suchfunktion:
function abc() {
.
.
.
$levData='';
while ($items=$db->fetch_array($results)) {
  $levData.=$items['manufactorName'].'|#|';
}
$levData=substr($levData,0,-3);
$levClosest=useLevenshtein($manToCheck,$levData);
similar_text($manToCheck,$levClosest,$levPercentage);
if ($levPercentage>50) {
  $levPercentage=round($levPercentage,2);
  return "Meinten Sie ".$levClosest.'? Immerhin eine Übereinstimmung von '.$levPercentage.'%!';
} else {
  //Insert new manufactor
}

.
.
.
}
 
Zuletzt bearbeitet von einem Moderator:
Es geht hier vor allem um die Eintragung von neuen Begriffen in die Datenbank. Also keine noch keine Suche an sich.
Ich hoffe dass ich aber noch eine bessere Möglichkeit finde.
 
Zurück
Oben