Konzept zur Keyword-Suche
Linuchs
- programmiertechnik
Moin,
gibt es irgendwo eine Norm oder ein Usus (Brauch), nach was gesucht werden muss, wenn der User bestimmte Begriffe eingibt?
Vor Jahren gab es das mal bei Google, zuerst sollten die Treffer kommen, die sämtliche Worte des Suchbegriffs enthalten. Ist nicht mehr so.
In meinem Kalender biete ich eine Suchfunktion an.
Nehmen wir mal shanty-chor
, das kann im Namen von Mitgliedern oder in Titeln von Veranstaltungen enthalten sein. Andere Suchbegriffe können auch Ortsnamen finden.
Wer danach sucht, erwartet wohl auch Treffer wie shantychor
und shanty chor
, aber nicht Wort-Drehungen wie chor für shantys
. Das wäre abgedeckt mit
$keyword = "shanty-chor";
$keyword = str_replace( "-", "%", mb_strtoupper( $keyword ));
AND UPPER( trm1.titel ) LIKE '%".$keyword."%' COLLATE utf8_bin
(COLLATE utf8_bin sorgt dafür, dass bei Suche nach ö
NICHT AUCH nach o
gesucht wird)
Es wäre wohl falsch, alle Sonderzeichen und Leerzeichen des Suchbegriffs mit %
als SQL-Platzhalter zu ersetzen? Aber wenn ich nur Leerzeichen ersetze, findet shanty-chor
die anderen Schreibweisen nicht.
Bei Eingabe mit Gänsefüßen "shanty chor"
ist das Leerzeichen relevant.
Alternativer Ansatz: Nach mehreren Worten suche ich einzeln, dann werden auch Dreher gefunden und Feldinhaltemit anderen Worten dazwischen:
$arr = explode( " ", "shanty chor festival" );
$q = "
..."
foreach( $arr as $suchwort ) {
$q .= "OR LOWER( trm1.titel ) LIKE '%".$suchwort."%' COLLATE utf8_bin
":
}
Wie könnte ich die Ausgabe sortieren, dass die meisten Übereinstimmungen zuerst kommen? Chorfestivals ohne shanty sind in diesem Zusammenhang nicht interessant.
Gruß, Linuchs
Hallo,
gibt es irgendwo eine Norm oder ein Usus (Brauch), nach was gesucht werden muss, wenn der User bestimmte Begriffe eingibt?
ob es festgeschriebene Regeln oder einen Standard gibt, weiß ich nicht. Üblich ist aber:
Vor Jahren gab es das mal bei Google, zuerst sollten die Treffer kommen, die sämtliche Worte des Suchbegriffs enthalten. Ist nicht mehr so.
Nein? Ich meine schon. Zuerst die, die alle Suchbegriffe enthalten (UND), weiter hinten auch die, die nur eine Teilmenge der Suchbegriffe enthalten (ODER).
Nehmen wir mal
shanty-chor
, das kann im Namen von Mitgliedern oder in Titeln von Veranstaltungen enthalten sein. Andere Suchbegriffe können auch Ortsnamen finden.Wer danach sucht, erwartet wohl auch Treffer wie
shantychor
undshanty chor
, aber nicht Wort-Drehungen wiechor für shantys
.
Vielleicht nicht bewusst. Wenn diese Stelle aber auch bei den Treffern auftaucht, wird sich mancher an die Stirn klatschen: Ach ja, stimmt eigentlich!
Anstatt einzelner Suchbegriffe auch Wortkombinationen zu finden, dürfte etwas kniffliger sein.
(COLLATE utf8_bin sorgt dafür, dass bei Suche nach
ö
NICHT AUCH nacho
gesucht wird)
Elegant wäre aber, wenn bei der Suche nach 'ö' alternativ auch 'oe' gefunden wird. Zumindest im Deutschen - in Schwedisch, Türkisch oder Ungarisch wäre das vermutlich Unsinn.
Es wäre wohl falsch, alle Sonderzeichen und Leerzeichen des Suchbegriffs mit
%
als SQL-Platzhalter zu ersetzen? Aber wenn ich nur Leerzeichen ersetze, findetshanty-chor
die anderen Schreibweisen nicht.
Ich würde einen anderen Ansatz wählen:
Bei Eingabe mit Gänsefüßen
"shanty chor"
ist das Leerzeichen relevant.
Okay, das ist dann ein Sonderfall, den du beim Parsen in Schritt 1 berücksichtigen musst.
Alternativer Ansatz: Nach mehreren Worten suche ich einzeln, dann werden auch Dreher gefunden und Feldinhalte, in denen die Worte in anderer Reihenfolge vorkommen:
Ach, genau. Eben sag ich's noch ... ;-)
Wie könnte ich die Ausgabe sortieren, dass die meisten Übereinstimmungen zuerst kommen?
Indem du zu jeder Teilsuche die Zahl der Treffer mitführst?
So long,
Martin
Ist es gleichwertig, ob ich mit UPPER oder mit LOWER arbeite?
Was wäre UPPER("ß") ?
Hallo Linuchs,
UPPER("ß") == "ẞ" (großes ẞ)
Aber ich würde keine edlen Körperteile drauf verwetten, dass das alle Systeme korrekt unterstützen. Ob Du mit LOWER besser bedient bist, kann ich allerdings auch nicht sagen.
Sicherer wäre vermutlich, ß und ẞ durch ss zu ersetzen. Analog alle Akzentzeichen. Bzw wenn Du in MYSQL suchst, überlass das dem Burschen, in dem Du eine Collation mit ci und ai verwendest (case insensitive, accent insensitive). Ich weiß allerdings nicht ab welcher MYSQL Version die ai Collations unterstützt werden.
Was ist eigentlich, wenn Dir jemand Shantychor eingibt? Soll auch dann Shanty gefunden werden? Sprich: Brauchst Du ein Wörterbuch, um zusammengesetzte Begriffe zu erkennen (ohne Wörterbuch kann das schief gehen, siehe Urinstinkt)? Ein Wörterbuch könnte Dir dann auch Flexionen in Grundformen übersetzen und die Schreibweise neutralisieren. Was im Wörterbuch drinsteht, kann sich auf Grund deiner Stichworte entwickeln. Trivial ist die Sache jedenfalls nicht. Suchmaschinen sind nicht ohne Grund kompliziert.
Wenn deine Seite komplett Google-indiziert ist, könntest Du auch einfach frech die Google-Suche nutzen und site:remso.eu hinzufügen...
Rolf
Tipp: Die MySQL Doku beschreibt sehr ausführlich wie man eine Volltextsuche realisiert. Und wie man sie verfeinert. MFG
wie man eine Volltextsuche realisiert.
Da habe ich mich nie rangetraut als Bangebüx, dass die Suche zu lange läuft.
Die Zahl meiner Datensätze ist nur ein kleiner 4-stelliger Wert, da mag das noch akzeptabel sein.
Hat jemand Erfahrung mit Volltextsuche gegen Suche in einem bestimmten Datenfeld (Titel) bei 1500 Datensätzen?
Hallo Linuchs,
die 1500 ist nicht das alleinige Kriterium. Wieviele User pro Sekunde machen das gleichzeitig?
Rolf