Volltextsuche in mySQL über PHP

Hai, Ihr Datenbank-Freaks,

ich möchte in meinem Shop selbstverständlich eine Stichwortsuche anbieten, dafür gibt’s ja bie mySQL die schnuckelige match…against-Funktion - allerdings bin ich mit den gelieferten Ergebnissen mehr als unzufrieden…

  • das mit den + vor den eigentlichen Stichworten funktioniert so nicht. Laut mySQL-Beschreibung soll z.B. die Angabe „+Canon +Komp“ nur die Datensätze anzeigen, die beide Worte enthalten, es wird aber auch „Canon BC-01 sw Org.“ mit angezeigt, obwohl da nirgens nicht ein „Komp“ drin vorkommt :frowning:
  • das Einschließen mit Anführungsstrichen, z.B. „GP 160“ funktioniert auch nicht (kein Ergebnis, obwohl mindestens ein Datensatz angezeigt werden müsste) :frowning:
  • die Begrenzung auf vier Zeichen ist für meinen Fall auch mehr als bescheuert - die Hersteller nennen ihre Druckertypen eben nur 360 oder C70 :frowning:

So schön es ist, daß man mehrere Stichworte angeben kann, nützt mir das Ganze garnix, wenn’s nicht funzt :frowning:((
Also, wer hat 'ne Alternative (oder 'n Tip, wie es richtig geht)?

Ach ja, mySQL ummodeln is’ nich’ - ist dem Provider seins…

frustierten Gruß
Sibylle

besonders performant wiord es wohl nicht…

$foo = "Komp Canon"; // aus dem feld suchbegriff
$foo = ereg\_replace("[]+"," ",$foo);
$foo = explode(" ",$foo);

$where = "1 ";
foreach ($foo as $bar)
 { $where .= " and feldname like '%$bar%'; }

$res = dbQuery("select feld from tabelle where $where");

Hai, dog.je,

besonders performant wiord es wohl nicht…

schade - aber ich wär ja schon dankbar, wenn’s überhaupt ginge…
allerdings brauch ich 'ne Erklärung zu dem da

$foo = „Komp Canon“; // aus dem feld suchbegriff
$foo = ereg_replace("[]+"," ",$foo);

Was sagen mir denn die eckigen Klammern und das Plus dahinter? Wenn ich die Erklärung im PHP-Manual richtig interpretiere, bedeutet das, daß ein String, der so „[]+“ aussieht, gegen ein Leerzeichen austausche…

$foo = explode(" ",$foo);

Ich mach aus der Stichwort-Liste in dem String ein Array *boah - ich hab was verstanden*

$where = "1 ";

Warum soll denn der Bedingungs-Teil mit 1 anfangen?

foreach ($foo as $bar)

Für jedes Teil, das in dem Array ist…

{ $where .= " and feldname like ‚%$bar%‘; }

erweitert der 'puter den Bedingungsteil…
Aus welchem Grund stehen da %-Zeichen um $bar?

$res = dbQuery(„select feld from tabelle where $where“);

Dank Dir für die Mühe
Gruß
Sibylle

$where = "1 ";

Warum soll denn der Bedingungs-Teil mit 1 anfangen?

Ich schätze es hätte 1 = 1 oder so heissen sollen, lediglich ein dummy eintrag um nachher beim „and …“ sicherzugehen dass schon was vornedranstand und keine sonderbehandlung für den ersten fall machen zu müssen

{ $where .= " and feldname like ‚%$bar%‘; }

erweitert der 'puter den Bedingungsteil…
Aus welchem Grund stehen da %-Zeichen um $bar?

Das sind Platzhalter im SQL für null bis beliebig viele Zeichen, also alles wo irgendwo im String $bar vorkommt, egal ob vorne in der mitte oder hinten.

P.S. die mySQL Volltextsuche mit match against ist mit SIcherheit vorzuziehen, allerdings funktionieren die Operatoren wie + und - und so erst ab mySQL 4, das hat noch kaum eienr im Einsatz.

Grüße
Bruno

1 Like

$foo = ereg_replace("[]+"," ",$foo);

Was sagen mir denn die eckigen Klammern und das Plus dahinter?
Wenn ich die Erklärung im PHP-Manual richtig interpretiere,
bedeutet das, daß ein String, der so „[]+“ aussieht, gegen
ein Leerzeichen austausche…

lies: „ersetze 1 oder beliebig viele leerzeichen durch 1 leerzeichen“ wenn du zwei leerzeichen im suchstring haette, wuerdest du ein suchwort mit null-laenge erhalten, und das ergebnis in der where-klausel waere " where 1 and feld like ‚%Komp%‘ and feld like ‚%%‘ and feld like ‚%Canon%‘"

$where = "1 ";

Warum soll denn der Bedingungs-Teil mit 1 anfangen?

wenn kein suchwort angegeben wurde gibt die suche alles zurueck und schmeisst keinen fehler

1 Like

$where = "1 ";

Warum soll denn der Bedingungs-Teil mit 1 anfangen?

Ich schätze es hätte 1 = 1 oder so heissen sollen

ich werde nie verstehen, warum ich das so schreiben sollte, wenn mir 1 auch true zurueckgibt…

Hai, Bruno,

Ich schätze es hätte 1 = 1 oder so heissen sollen, lediglich
ein dummy eintrag um nachher beim „and …“ sicherzugehen dass
schon was vornedranstand und keine sonderbehandlung für den
ersten fall machen zu müssen

OK - da ich sowieso noch andere Suchkriterien „vorschalte“, brauch ich diesen Schritt nicht…

Das sind Platzhalter im SQL für null bis beliebig viele
Zeichen, also alles wo irgendwo im String $bar vorkommt, egal
ob vorne in der mitte oder hinten.

Aaahhh - Erleuchtung

Operatoren wie + und - und so erst ab mySQL 4, das hat noch
kaum eienr im Einsatz.

Daher funzt das nicht, manchmal scheine ich vorzugehen wie 'ne falsch gestellte Uhr - da steht jetzt natürlich die Frage im Raum rum, ob ich nicht 'ne schlichte Suchfunktion mit nur einem Stichwort einrichte und doch „match“ nehme…

Dank Dir
Sibylle

Hai, dog.je,

ich werde nie verstehen, warum ich das so schreiben sollte,
wenn mir 1 auch true zurueckgibt…

*kicher* Vielleicht, weil es (mir zumindest) schwerfällt, wieder auf „simpel-Modus“ zurückzuschalten, nachdem sich gerade erst mühevoll angewöhnt hat, 'nem 'puter alles haarklein definieren und aufdröseln zu müssen…

Gruß
Sibylle

Hai, dog.je,

lies: „ersetze 1 oder beliebig viele leerzeichen durch 1
leerzeichen“ wenn du zwei leerzeichen im suchstring haette,
wuerdest du ein suchwort mit null-laenge erhalten, und das
ergebnis in der where-klausel waere " where 1 and feld like
‚%Komp%‘ and feld like ‚%%‘ and feld like ‚%Canon%‘"

Aaaahh - noch mehr Erleuchtung…

wenn kein suchwort angegeben wurde gibt die suche alles
zurueck und schmeisst keinen fehler

OK - nu hab ich’s gepeilt - hab das anders gelöst, werd’ mir den Hinweis aber merken und checken, ob ich da nicht noch die eine oder andere Zeile aus dem Code schmeißen kann (muß ja sowieso nochmal aufräumen…)

Fühl Dich geknuddelt
Sibylle

ich werde nie verstehen, warum ich das so schreiben sollte,
wenn mir 1 auch true zurueckgibt…

Hast recht, 1 funktioniert in mySQL auch… würde mich aber nicht drauf verlassen dass das jeder SQL Parser als true interpretiert