Mysql Volltext Suche oder Like?

jojojan

Mitglied
Guten Abend,

mich beschäftigt nun schon etwas länger eine Frage.
Ich möchte für einen Webshop eine Artikelsuche realisieren dabei soll nur der Artikeltitel durchsucht werden und es müssen alle Suchbegriffe im Artikeltitel vorkommen.
Beispiel:

$Suche = Iphone 3 GS

Es sollen nur alle Artikel zurückgeben werden die alle Wörter im Artikeltitel "Iphone 3 GS" stehen haben.

Nun wäre meine Frage was Ressourcen schonender ist, eine Volltext Suche oder aber wenn ich die Leerzeichen durch "%" ersetze und dann die Suche über Like laufen lassen, also quasi so:

PHP:
SELECT ArtikelTitel FROM Artikel WHERE ArtikelTitel LIKE '%Iphone%3%GS%'

Gruß
jojojan
 

chmee

verstaubtes inventar
Premium-User
Wenn DU Dir sicher bist, dass Du mit "Iphone 3 GS" auch alle Einträge findest, kannst Du es so machen. Wenn aber auch Einträge wie "Iphone 3GS" oder "iPhone 3Gs" finden möchtest, solltest Du (A) UPPER() einbauen und (B) den Suchstring per Leerzeichen exploden und mehrere AND daraus stricken. Am Ende wäre vielleicht Folgendes besser:
Code:
SELECT ArtikelTitel,id FROM Artikel
WHERE UPPER(ArtikelTitel) LIKE UPPER('Iphone') 
AND UPPER(ArtikelTitel) LIKE UPPER('3')
AND UPPER(ArtikelTitel) LIKE UPPER('GS')

mfg chmee
 

jojojan

Mitglied
Danke schon mal für deine Antwort.

Ich hab das grad mal getestet mit dem LIKE. Also bei mir spuckt er mir dann auch "iPhone 3G" und "Iphone 3 gs" usw. aus. Also scheint er zwischen Groß- und Kleinschreibung keinen Unterschied zu machen.
Ich denke dann werde ich es mit dem LIKE machen, muss ich nur noch schauen wie ich den String dann mit den "%" Zeichen aufbereitet krieg.

Gruß
jojojan
 

timestamp

Mitglied Käsekuchen
NUr kurz anbei, das mit der Groß- und Kleinschreibung liegt nicht am LIKE sondern am UPPER, das die Strings in Großbuchstaben umwandelt.
 

Flex

(aka Felix Jacobi)
Jap, grundsätzlich ignoriert MySQL Groß- und Kleinschreibung. Nur wenn das BINARY Attribut gesetzt ist, wird da unterschieden.

Ansonsten solltest du dir bewusst machen, dass LIKE sich genauso wie der =-Operator verhält, wenn keine Wildcards benutzt werden.

Ein kleiner Artikel zur Performance:

Volltextsuche in Datenbanken

Ansonsten wird dir da Google bestimmt weiterhelfen für spezifische Zahlen... Letztendlich gibt dir die Volltextsuche mehr Möglichkeiten zur Gewichtung von Ergebnissen, während die Wildcard-Variante mit Indizes wohl "schneller" ist... (Achtung, Vermutung)
 

jojojan

Mitglied
Vielen Dank für den Link, den kannte ich noch nicht, ist aber ganz interessant.

Aber ich denke für mich reicht die Variante mit LIKE da ich nur den Artikeltitel durchsuchen will und wirklich alle Wörter drin vorkommen sollen. Und bei der Volltextsuche spuckt er mir ja alle Artikel aus wo nur ein Wort drin vorkommt und ich denke da sind die Suchergebnisse dann eher frustrierend als hilfreich.

Was mir aber gerade aufgefallen ist, meine Variante scheint noch nicht ganz ausgereift zu sein. Wenn ich nun beispielsweise nach:

PHP:
SELECT ArtikelTitel FROM Artikel WHERE ArtikelTitel LIKE '%GS%3%Iphone%'

suche, liefert er mir wesentlich weniger Ergebnisse als wenn ich nach:

PHP:
SELECT ArtikelTitel FROM Artikel WHERE ArtikelTitel LIKE '%Iphone%3%GS%'

suche.

Mir war nicht bewusst dass die Reihenfolge trotz Wildcards eine so große Rolle spielen. Gibt es da eine einfache Möglichkeit die Reihenfolge zu ignorieren?

Gruß
jojojan
 

Yaslaw

n/a
Moderator
% ist wie das * in Windows
'%GS%3%Iphone%' sucht also irgendwas, gefolgt von GS, gefolgt von irgendwas, dann eine 3, dann irgendwass, gefollgt von Iphone und zuguter letzt nochmals irgendwas.

Wenn du 'iphone 3GS' und '3GS iphone' mit LIKE finden willst, dann ist der Ansatz von chmee fast richtig. Einfach noch die % hinzufügen.
Anstelle von '%suchbegriff%' kannst du auch mit INSTR() arbeiten. Was schneller ist, weiss ich grad nicht

SQL:
SELECT ArtikelTitel,id FROM Artikel
WHERE ArtikelTitel LIKE '%Iphone&' 
AND ArtikelTitel LIKE '%3%'
AND LOCATE(ArtikelTitel, 'GS')
 

jojojan

Mitglied
So ich hab mir nun was zusammen gebastelt, danke nochmal für eure Hilfe, vielleicht kanns ja sonst noch jemand gebrauchen.
PHP:
//Sonderzeichen entfernen nur Zahlen und Buchstaben zulassen
$search_key = preg_replace('/[^a-zA-Z 0-9]/', '', $search_key);

//Zahlen von Buchstaben trennen um Suche zu verbessern (Iphone 3GS --> Iphone 3 GS)
$search_key = preg_replace('/[a-z]+|[0-9]+/', '\0 ', $search_key);

//Überflüssiger Leerzeichen entfernen
$search_key = preg_replace('/\s\s+/', ' ', $search_key);

//Leerzeichen am Anfang und Ende entfernen
$search_key = trim($search_key);

//String in Wörter zerlegen
$search_key = explode(" ",$search_key);

$such_query = "SELECT ArtikelTitel
							FROM Artikel
							WHERE ";
    						for($i=0; $i<count($search_key); $i++)
								{
									$such_query .= "ArtikelTitel LIKE '%".mysql_real_escape_string($search_key[$i])."%'";

									if($i<count($search_key)-1)
										{$such_query .= " AND ";}
    							} 
							

$such_result= mysql_query($such_query);