Stichworte Benutzer emöglichen
yvr-webdesign
- datenbank
Hallo @ all,
ich baue zur Zeit eine Tutoriallinksammlung auf meiner Seite auf. Jeder Eintrag hat einen Titel, eine Kurzbeschreibung und einen Link, der zum entsprechenden Tutorial führt. Es gibt derzeit fünf Bereiche. Klickt man auf einen Bereich, werden alle Einträge zu diesem Bereich aus der Datenbank herausgelesen und angezeigt.
Nun möchte ich den Besuchern auf meiner Seite zusätzlich ermöglichen, über die Eingabe von Suchbegriffen, sich passende Einträge anzeigen zu lassen. Dabei soll per SQL Befehl sowohl der Titel als auch die Kurzbeschreibung auf das oder die vom Besucher eingegeben Suchbegriffe hin verglichen werden und nur die Einträge angezeigt werden, die entweder im Titel oder in der Kurzbeschreibung eines der eingegebenen Suchworte aufweist.
Das Problem was sich mir dabei stellt, dass ich nicht weiß, wie ich mittels SQL einen Vergleich eines Suchbegriffes mit einem in der Datenbank gespeicherten längeren Text herstelle.
Habe bereits gegoogelt, bin aber nicht weitergekommen.
Kennt sich da vielleicht jemand mit aus und kann mir einen Ansatz geben? Kennt vielleicht jemand auch ein gutes Tutorial zu diesem Thema?
Habt vielen Dank für Eure Mühe,
LG yvr
Hallo,
Das Problem was sich mir dabei stellt, dass ich nicht weiß, wie ich mittels SQL einen Vergleich eines Suchbegriffes mit einem in der Datenbank gespeicherten längeren Text herstelle.
Du suchst die Volltextsuche. Diese ist von Datenbankmanagementsystem (DBMS) zu Datenbankmanagementsystem unterschiedlich implementiert. Du solltest also das DBMS (z.B. MS SQL-Server, MySQL, Oracle, PostgreSQL, DB2, um nur ein paar zu nennen) angeben, damit man Dir gezielt weiterhelfen kann.
Freundliche Grüße
Vinzenz
Hallo,
Nun möchte ich den Besuchern auf meiner Seite zusätzlich ermöglichen, über die Eingabe von Suchbegriffen, sich passende Einträge anzeigen zu lassen. Dabei soll per SQL Befehl sowohl der Titel als auch die Kurzbeschreibung auf das oder die vom Besucher eingegeben Suchbegriffe hin verglichen werden und nur die Einträge angezeigt werden, die entweder im Titel oder in der Kurzbeschreibung eines der eingegebenen Suchworte aufweist.
Es ist leider so, dass es kein RDBMS gibt, was eine Volltextsuche mit komplexen Suchausdrücken (AND, OR, NEAR und so und das auch noch geschachtelt und geklammert) in sich implementiert hat.
In meiner Praxis verwende ich für eine Volltextsuche das Perl-Modul Text::Query, womit ich Tabellen einfach nur durchscanne. Bis in etwa 20.000 Datensätzen funktioniert sowas einigermaßen performant. Der Besucher kann komplexe Suchterms eingeben im Stil von Altavista (+zeigdas -dasnich => zeigt alle Dokumente, in denen das Wort "zeigdas" vorkommt, nicht jedoch "dasnich").
Mehr Performanze kanns geben, wenn die Suche eingeschränkt werden kann auf bestimmte Felder (auf denen ein RDBMS-spezifischer Index liegt) und Case sensitive.
Eine andere Möglichkeit, dem Besucher mehr Komfort zu bieten, besteht darin, ein Stichwortverzeichnis, sozusagen einen Index zu erstellen, welcher über dem gesamten Content oder Teile dessen liegt (Beispiel: Title-Tag, Body-Tag). Ein solcher Index wird asynchron aktualisiert über einen Cronjob oder händisch oder Trigger.
Ein Benutzer-Frontend stellt z.B. die Anfangsbuchstaben aller Worte dar als Link, ein Klick auf den Buchstaben listet alle Schlagworte auf, die mit dem ausgewähltem Buchstaben beginnen und zeigt daneben die jeweiligen Links an, in denen das Wort vorkommt.
Ajax bietet weitere Möglichkeiten, siehe Beispiel google/suggest: Der Besucher gibt die Anfangsbuchstaben seines Suchwortes ein und kriegt eine Liste mit passenden Ergänzungen. SQL like ist hier Dein Freund.
Ansonsten, was Suche in RDBMS betrifft, siehe Post von Vinzenz, speziell schaue nach der Art von Indizierung was das RDBMS zu bieten hat.
Viele Grüße,
Hotte
Vielen Dank Hotte und Vincent,
vielen Dank für die Darstellung der Möglichkeiten wie man dem Benutzer ein bissel mehr Komfort bieten kann. Über ein Indexverzeichnis habe ich bereits auch nachgedacht. AJAX ist natürlich cool, bissel Grundkenntnisse besitze ich bereits, komfortabler meiner eigenen Benutzersicht und für meine Zwecke ausreichend aus finde ich aber die Schlagwortsuche.
Stichwort ist also die "Volltextsuche" *notier* :O)
Achja das DBMS ist MySQL in der Version 5.0.45.
LG yvr
Hallo
Stichwort ist also die "Volltextsuche" *notier* :O)
Achja das DBMS ist MySQL in der Version 5.0.45.
dann empfehle ich Dir das Handbuchkapitel Fulltext Search. Falls Probleme auftreten, lohnt sich eine Suche hier im Archiv - und natürlich Nachfragen.
Freundliche Grüße
Vinzenz
Heißen Dank Vinzenz, werde mich da mal durcharbeiten :o)
LG yvr
Hi,
AJAX (Asynchronous Javascript and XML) hat als Technologie für Kommunikation rein gar nichts mit einer Funktionalität zur Datensuche in einer Datenbank zu tun, da kann es noch so "cool" sein. ;)
Du könntest dir zum Beispiel mal OpenSource Wikis anschauen, wie diese Volltext- und Stichwort-Suchfunktionen in Code umgesetzt haben. Dazu brauchst du natürlich eine gewisse Portion Fach/Sachverständnis und Einfühlungsvermögen. Aber gut geklaut ist immer besser als schlecht selbst erfunden ;)
Ciao, Frank
Hi Frank :O)
"AJAX (Asynchronous Javascript and XML) hat als Technologie für Kommunikation rein gar nichts mit einer Funktionalität zur Datensuche in einer Datenbank zu tun, da kann es noch so "cool" sein. ;)
"
Ich habe bereits einmal ein wenig mit AJAX herumexperiment.
Wenn ich das noch richtig auf die Reihe bekommen, wurde bei Klick auf einen Eintrag in einem Select Formular automatisch der Wert des Eintrages mit JavaScript durch den Einsatz des XMLHttpObject an eine andere Datei übergeben. Dort wurde der übergebene Wert in ein select-Befehl aufgenommen. Und aus dem aus der Datenbank ausgegebenen Resultset wurde eine XML generiert, dessen Ergebisse wurden zurückgeliefert an die ursprüngliche Datei, dort ausgelesen und in einem anderern select-Formular wiederum angezeigt. das funktionierte für jeden Eintrag in der select-Box. Es wurden für jeden Eintrag in dem ersten Formular aus der Datenbank nur die Ergebnisse herausgelesen und in einem weiteren Formular angezeigt, die zu dem angeklickten Eintrag passten. Wenn auch recht aufwendig, die Geschichte funktionierte. Ja und das fand ich cool :O). Das Ganze hat doch insofern mit einer Datensuche in einer Datenbank zu tun? Oder sprechen wir gerade aneinander vorbei? ;o)
"Du könntest dir zum Beispiel mal OpenSource Wikis anschauen, wie diese Volltext- und Stichwort-Suchfunktionen in Code umgesetzt haben. Dazu brauchst du natürlich eine gewisse Portion Fach/Sachverständnis und Einfühlungsvermögen. Aber gut geklaut ist immer besser als schlecht selbst erfunden ;)
"
Vielen Dank für den Tipp :O) Werde ich tun! :O)
LG yvr
Hi,
zum Zitieren von Teilen aus anderen Beiträgen, könntest du vielleicht besser die bereits vorgeschlagene Variante von
zititerter text
verwenden, dann sehen viele Benutzer des Forums sofort den Unterschied. Mit "zitierter Text" ist das nicht so offensichtlich zu erkennen, aber das ist nicht tragisch.
Um nochmal auf das Thema AJAX einzugehen, AJAX erlaubt dir einfach clientseitig asynchron eine weitere Resource (z.b. ein HTML Fragment) anzufordern und damit (mit dem Ergebnis dieses Aufrufs) dann clientseitig herumzuspielen.(Punkt)
Wenn du ein Bild anforderst, bekommst du ein Bild, bei der Frage nach einer HTML-Seite, bekommst du ein HTML Fragment/Dokument zurück. Wenn du nach einer PHP Seite fragst, bekommst du auch Daten zurück, aber nachdem der Server (PHP Interpreter) die Anfrage beabeitet hat und entschieden hat, was er dir zurückgibt. Dass dann der Code in dieser PHP-Seite eine Datenbankabfrage macht, ist möglich. Aber das sind zwei völlig von einander getrennte Prozesse bzw. Abläufe.
Wenn du das Gespräch mit der Datenbank suchst, solltest du auch deren Sprache (SQL) sprechen. AJAX ist in dem Zusammenhang auch keine Sprache, sondern ein Pattern (Muster), Javascript die Sprache dahinter.
Versuch doch mal die Resource (PHP-Seite), die du mit dem XMLHttpObject anforderst direkt in einem Browser aufzurufen. Dann findet die Datenbankabfrage trotzdem statt.
Hoffe, es ist jetzt klar, was ich meinte :)
Ciao, Frank