Die Suchmaschine mnoGoSearch
Die Suchmaschine mnoGoSearch
Im November 2007 wurde mnoGoSearch durch
die Kombination von Google für externe Seiten und Nutch für interne
Seiten ersetzt.
In formationen finden Sie unter: http://www.cms.hu-berlin.de/portale/entwickler/volltextsuche
Das Angebot von Informationen im World Wide Web ist mittlerweile so
groß geworden, dass es ohne Suchmaschinen nicht mehr möglich ist,
relevante Informationen zu finden.
Nachdem 1999 die Harvest-Suchmaschine durch ht://dig abgelöst wurde,
kam im Juni 2002 der Zeitpunkt, an dem auch ht://dig an die Grenze
seiner Leistungsfähigkeit kam. Bei mehr als 500.000 regelmäßig
indexierten Seiten, verteilt auf über 50 Web-Server an der HU-Berlin,
kam jetzt die Stunde von mnoGoSearch (http://www.mnogosearch.org/).
Diese Seite soll einen kurzen Einstieg für Web-Seiten-EntwicklerInnen
an der HU darstellen, die ihre Seiten durch eine Suchfunktion erweitern
möchten.
Wie binde ich die Suchmaschine in meine Seiten ein?
Fügen Sie das folgende HTML-Codeschnipsel in Ihre Seite ein:
<form method="get" action="http://www.hu-berlin.de/mnogosearch/suche.cgi">
Begriff:
<input type="text" name="q" value="" size="15" maxlength="40">
<input type="submit" name="cmd" value="suchen">
</form>
Falls Sie die Suchmaschine auf einen Teil der Seiten einschränken möchten:
<form method="get" action="http://www.hu-berlin.de/mnogosearch/suche.cgi">Das Prozent-Zeichen (%) am Ende nicht vergessen!
Begriff:
<input type="text" name="q" value="" size="15" maxlength="40">
<input type="hidden" name="ul" value="http://www.hu-berlin.de/cms/%" size="15" maxlength="40">
<input type="submit" name="cmd" value="suchen">
</form>
Damit wird die Suche auf Seiten, die unter "http://www.hu-berlin.de/cms/" liegen, eingeschränkt.
Sie können die URL auch selbst erzeugen, um z.B. einen Link auf ein bestimmtes Suchergebnis zur Verfügung zu stellen.
Hier ein Beispiel für einen Link, der nach dem Begriff "Suchbegriff" auf allen indexierten Servern sucht:<a href="http://www.hu-berlin.de/mnogosearch/suche.cgi?q=Suchbegriff">Suche nach Suchbegriff</a>
Hier ein Beispiel für einen Link, der nach dem Begriff "Suchbegriff" auf Seiten, die unter "http://www.hu-berlin.de/cms/" liegen, sucht.
<a href="http://www.hu-berlin.de/mnogosearch/suche.cgi?q=Suchbegriff&ul=http%3A%2F%2Fwww.hu-berlin.de%2Fcms%2F%25
Die URI muss hex-escaped werden. Das abschliessende "%" muss in seiner hex-escaped Form, also als "%25" geschrieben werden!
Wofür brauche ich eine spezielle Abfrageseite?
Für die überwiegende Anzahl der Fälle reicht die obenangeführte Methode aus, um Ihre Seiten durchsuchbar zu machen. Falls Sie jedoch das Aussehen der Ergebnisseiten an Ihre Seite anpassen wollen, dann müssen Sie dafür eine Vorlage erstellen. Wie das genau funktioniert, wird im folgenden beschrieben:
Wie erzeuge ich eine Vorlage für die Abfrageseite
Zuerst einmal etwas zum grundsätzlichen Aufbau einer Ergebnisseite
der Suchmasschine. Die Seite wird intern von der Suchmaschine nach dem
Baukastenprinzip aus mehreren Bloecken zusammengestzt. So gibt es z.B.
einen Block der immer an den Anfang einer Seite gehört, einen Block,
der das Suchergebnis darstellt und einen Block, der bei einem Fehler
ausgegeben wird. Nachdem dann alle Blöcke in der richtigen Reihenfolge
zusammengesetzt sind, wird das Ergebnis an den Nutzer geschickt.
Da die Aufgaben einer Suchmaschine ziemlich begrenzt sind, gibt es
nicht allzuviele verschiedene Möglichkeiten diese Blöcke zusammen zu
setzten, genauer gesagt, gibt es nur die vier folgenden:
| Gefundene Suchergebnisse. | Es wurde kein Suchbegriff eingegeben. | Es wurden keine passenden Suchergebnisse gefunden. | Während der Suche trat ein Fehler auf. | ||||||||||||||||
|
|
|
|
Doch genug der grauen Theorie, am besten versteht man die Dinge
immer noch an einem Beispiel.
Sie können dieses Beispiel auch als Vorlage für
Ihre eigene Suchmaschinenseite benutzen oder auch in Aktion
sehen.
Kommentierte Beispielvorlage
Im Abschnitt "Variables" werden einige Werte gesetzt, die fuer alle
Vorlagen gleich sind, wie z.B. die Anbindung an die Datenbank.
Diesen Teil sollten Sie ohne Änderungen übernehmen.
<!--variables
Include std.conf
-->
Hier beginnt der Abschnitt "top". Wie Sie sich sicher noch erinnern, wird "top" am Anfang jeder Seite ausgegeben:
<!--top-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta name="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Suche auf Servern der HU</title>
<link href="/hu/css/hu.css" type="text/css" rel="stylesheet">
</head>
<body bgcolor="#ffffff">
<form action="$(self)" method="get">
<table summary="" width="98%" border="0" align="center">
<tr>
<td valign="top">
<h2>Volltextsuche auf Servern der Humboldt-Universität</h2>
</td>
</tr>
</table>
<table summary="" width="98%" border="0" align="center">
<tr>
<td bgcolor="#8888FF">
<b>Suche nach: </b>
<input type="text" name="q" value="$&(q)" size="40">
<select name="ps">
<option value="10" SELECTED="$(ps)">
10 Ergebnisse
</option>
<option value="20" SELECTED="$(ps)">
20 Ergebnisse
</option>
<option value="50" SELECTED="$(ps)">
50 Ergebnisse
</option>
</select>
<input type="submit" name="cmd" value="Suche!">
</td>
</tr>
<tr>
<td bgcolor="#EEEEFF">Ergebnisse finden <select name="m">
<option value="all" SELECTED="$(m)">
mit allen angegebenen Wörtern
</option>
<option value="any" SELECTED="$(m)">
mit irgendeinem der Wörter
</option>
<option value="bool" SELECTED="$(m)">
Boolean
</option>
</select></td>
</tr>
<tr>
<td bgcolor="#EEEEFF">Position des Suchbegriffes: <select name="wf">
<option value="1111" SELECTED="$(wf)">
irgendwo auf der Seite
</option>
<option value="0020" SELECTED="$(wf)">
im Titel der Seite
</option>
<option value="0200" SELECTED="$(wf)">
in den Schlüsselwörtern
</option>
<option value="2000" SELECTED="$(wf)">
in der Beschreibung der Seite
</option>
<option value="0002" SELECTED="$(wf)">
im Hauptteil der Seite
</option>
</select></td>
</tr>
<tr>
<td bgcolor="#EEEEFF">Ausgabeformat der Suchergebnisse: <select name="o">
<option value="0" SELECTED="$(o)">
Ausführlich
</option>
<option value="1" SELECTED="$(o)">
nur URL
</option>
</select></td>
</tr>
<tr>
<td>
<div align="right">
<a href="$(self)">Neue Suche</a>
</div>
</td>
</tr>
</table>
</form>
<!--/top-->
Ja, der Teil war sehr lang, die anderen Teile sind kürzer,
versprochen :-).
Nomen est omen, der Abschnitt "bottom" ist das genaue Gegenteil von
"top" und wird am Ende einer jeden Seite ausgegeben. Wenn Sie "top" und
"bottom" zusammen in eine HTML-Datei schreiben würden (natürlich sollte
"top" oben und "bottom" unten stehen), dann sollte das entstehende
Gebilde eine gültige HTML-Datei sein.
<!--bottom-->
<div class="fuss">
<hr noshade="noshade" size="1">
Probleme mit der Seite bitte an mich!
</div>
</body>
</html>
<!--/bottom-->
"restop" steht für "Results Top", d.h. alles was dort
drin steht, wird über den Suchergebnissen ausgegeben.
Ein guter Platz um Grüße loszuwerden, Werbung zu schalten oder auch
(wie langweilig) einfach Zusammenfassungen der Suchergebnisse
anzuzeigen.
<!--restop-->
Suchergebnisse: <small>$(WE)</small><HR>
Gefundene Seiten: $(first)-$(last) von insgesamt <B>$(total)</B>.
<!--/restop-->
Wie Sie sicherlich schon erraten haben, steht "resbot" für
"Results Bottom" und wird unterhalb der Suchergebnisse
angezeigt.
Viele Menschen sind mit den Ergebnissen auf der ersten Seite nicht
zufrieden, daher gibt man ihnen die Gelegenheit, weitere Seiten zu
betrachten, indem Navigationssysteme in diesen Block eingebaut werden
(Man beachte $(NL)$(NB)$(NR)).
<!--resbot-->
<HR>
<CENTER>
<TABLE BORDER=0>
<TR>
<TD>Suchergebnisse: </TD>$(NL)$(NB)$(NR)
</TR>
</TABLE>
</CENTER>
<!--/resbot-->
Endlich! Der "res"-Abschnitt. Mittlerweile dürfte klar geworden
sein, dass in diesem Abschnitt die Suchergebnisse angezeigt
werden.
Dem aufmerksamen Leser wird jedoch schon aufgefallen sein, dass es
zwei Abschnitte mit diesem Namen gibt.
Woran erkennt die Suchmaschine nun, welcher Abschnitt benutzt werden
soll? Dafür wertet sie den Parameter "o" aus: wenn "o" gleich 0 (Null)
ist, dann wird der erste "res"-Abschnitt benutzt, bei "o" gleich 1
(Eins), der zweite usw.
<!--res-->
<DL>
<DT>
<b>$(Order).</b><a href="$(URL)" TARGET="_blank">
<b>$&(Title)</b></a>
</DT>
<DD>
$&(Body)...<BR>
<UL>
<li>
<A HREF="$(URL)" TARGET="_blank">$(URL:40)</A>
($(Content-Type)) - $(Last-Modified) - $(Content-Length) bytes <BR>
</li>
</UL>
</DD>
</DL>
<!--/res-->
<!--res-->
<DL><DT>
<b>$(Order).</b> <a href="$(URL)" TARGET="_blank"
><b>$(URL:100)</b></a><DD>
</DL>
<!--/res-->
Damit die Nutzer sich zwischen den einzelnen Egebnisseiten bewegen können, werden durch die folgenden Abschnitte die Navigationslinks definiert: Der navleft-Abschnitt wird angezeigt, wenn es weiter nach "links" geht, d.h. in der Ergebnisliste rückwärts. Der navleft_nop-Abschnitt (nop steht für No OPeration) wird angezeigt, wenn es nicht weiter zurück geht. Für navright und navright_nop gilt analoges.
Wichtig ist dabei, dass navleft und navleft_nop bzw. navright und navright_nop austauschbar sind. Insbesondere Tabellenstrukturen müssen deshalb entweder doppelt (jeweils bei normal und _nop) oder besser ausserhalb dieser Abschnitte definiert werden.
<!--navleft-->
<TD><A HREF="$(NH)"><< Zurück</A></TD>
<!--/navleft-->
<!--navleft_nop-->
<TD><FONT COLOR=gray><< Zurück</FONT></TD>
<!--/navleft_nop-->
<!--navbar1-->
<TD><A HREF="$(NH)">$(NP)</A></TD>
<!--/navbar1-->
<!--navbar0-->
<TD>$(NP)</TD>
<!--/navbar0-->
<!--navright-->
<TD><A HREF="$(NH)">Vorwärts >></A></TD>
<!--/navright-->
<!--navright_nop-->
<TD><FONT COLOR=gray>Vorwärts >></FONT></TD>
<!--/navright_nop-->
Was tun, wenn trotz einer umfangreichen Datenbank, die Suche nach einem Wort fehlschlägt? Genau um dieses Problem kümmert sich der "notfound"-Abschnitt. Er sollte einige mehr oder weniger sinnvolle Begründungen enthalten, warum ein Suche fehlschlagen könnte.
<!--notfound-->
Suchergebnisse: <small>$(WE)</small><HR>
<CENTER>
<b>Leider lieferte Ihre Suchanfrage keine Ergebnisse.</b><P>
</CENTER>
Mögliche Ursachen:
<ul>
<li>Es werden keine Teilworte gesucht, deshalb auch lange Begriffe komplett eingeben.</li>
<li>Bestimmte Wörter treten in der Datenbank so häufig auf, dass die
Suche danach nicht durchgeführt wird (wie z.B. 'WWW', 'der', 'ein').</li>
<li>Sie haben die Suchkriterien zu sehr eingeschränkt.</li>
<li>Die Schreibweise des Wortes stimmt nicht.</li>
<li>Nach dem Suchbegriff wird nicht gesucht, versuchen Sie Synonyme für
Ihren Suchbegriff zu benutzen.</li>
<li>Der Suchbegriff existiert nicht auf den Servern.</li>
</ul>
<!--/notfound-->
In seltenen Fällen kann bei der Suche ein Fehler auftreten.
Empirische Untersuchungen haben ergeben, dass es Nutzer von
Suchmaschinen schätzen, in einem solchen Fall in dezentem Rot auf den
Fehler hingewiesen zu werden:
<!--error-->
<CENTER>
<FONT COLOR="#FF0000">Es ist ein Fehler aufgetreten!</FONT>
<P><B>$(E)</B>
</CENTER>
<!--/error-->
Manchmal ruft ein Benutzer die Suchmaschine auf, ohne einen
Suchbegriff eingegeben zu haben.
Da das Telepathie-Modul leider noch in der Entwicklung ist, empfiehlt
es sich in der Zwischenzeit eine kurze Anleitung zur Benutzung der
Suchmaschine zu präsentieren.
<!--noquery-->
<p><b>Hinweise:</b></p>
<ul>
<li>deutsche Umlaute sollten direkt eingegeben werden
(überall <b>nicht</b> &uuml;berall oder ueberall)</li>
<li><b>Teilworte</b> werden <b>nicht</b> gefunden!
Deshalb auch lange Begriffe komplett eingeben.</li>
</ul>
<!--/noquery-->
Wie binde ich die Vorlage in meine Seite ein?
Nachdem Sie die Vorlage erstellt bzw. angepasst haben, senden Sie die Datei an den Web-Administrator (webadm@rz.hu-berlin.de), der Ihre Datei dann auf dem Webserver installiert und Ihnen eine URL zuschickt, unter der Sie ihre angepasste Abfrageseite erreichen können.
Referenz
Mit Hilfe des obenstehenden Beispiels sollte es möglich sein,
kleinere Veränderungen am Layout durchzuführen und an die eigenen
Seiten anzupassen. Falls jedoch grössere Veränderungen nötig sind oder
wenn Sie Feinheiten der Konfiguration begreifen wollen, dann sollten
Sie sich auch den Rest dieser Beschreibung zu Gemüte ziehen.
Zu Beginn noch einmal ein Überblick und eine kurze Beschreibung der
vorhandenen Blöcke:
| top | Dieser Block wird immer am Anfang einer jeden Seite ausgegeben. |
| bottom | Dieser Block wird immer am Ende jeder Seite ausgegeben. |
| restop | Wenn Suchergebnisse vorhanden sind, wird dieser Block zu Beginn der Ergebnisliste ausgegeben und kann z.B. die Anzahl der gefundenen Begriffe anzeigen. |
| res | Dieser Block wird pro gefundenem Suchergebnis einmal ausgegeben. |
| resbot | Dieser Block wird am Ende der Ergebnisliste ausgegeben und kann z.B. Navigationselemente enthalten, um zwischen den Ergebnisseiten zu wechseln. |
| noquery | Dieser Block wird ausgegeben, wenn die Suche ohne Suchbegriff gestartet wurde. Er kann z.B. genutzt werden, um die Standardsuchseite anzuzeigen. |
| notfound | Dieser Block wird ausgegeben, wenn keine Ergebnisse für die Suche zurueckgeliefert wurden. Hier sollte beschrieben werden was der Benutzer zur Abhilfe tun kann. |
| error | Wie der Name schon sagt, wird dieser Block ausgegeben, falls während der Suche ein Fehler auftrat. |
Die Blöcke "restop", "resbot" und "res" können mehrfach auftreten,
die Reihenfolge ihres Auftretens wird benutzt um verschiedene
Ergebnisformatierungen darzustellen.
Damit man sich in den einzelnen Seiten der Suchergebnisse bewegen
kann, muss natürlich ein Navigationssystem vorhanden sein. Dieses
Navigationssystem setzt sich wieder aus mehreren Blöcken
zusammen:
| navleft/ navleft_nop |
Ein Link, der eine Suchergebnisseite zurück zeigt (navleft) oder eine "ausgegraute" Version, falls es nicht weiter zurück geht (navleft_nop). |
| navright/ navright_nop |
Ein Link, der eine Suchergebnisseite weiter zeigt (navright) oder eine "ausgegraute" Version, falls es nicht weiter geht (navright_nop). |
| navbar0 | Aktuelle Seitenzahl ohne Link |
| navbar1 | Andere Seitenzahlen mit Link |
Folgende Werte können an das Suchprogramm übergeben werden:
| q | (Query) Der Suchbegriff |
| t | (Tag) Finde Dokumente mit dieser, bei der Indexierung vergebenen, Markierung. |
| g | (lanGuage) Finde Dokumente, die in dieser Sprache verfasst wurden. Das Argument is der zweibuchstabige Ländercode. |
| ul | (Url-Limit) Finde Dokumente, die diese URL enthalten. |
| ps | (Page Size) Anzahl der Ergebnisse pro Seite. |
| m | (Match) Gibt an wie mehrere Suchbegriffe verknüpft werden sollen. Kann den Wert "any" (einer der Suchbegriffe muss vorkommen), "all" (alle Suchbegriffe müssen vorkommen) oder "bool" (eine Suche mit Bool'schen Funktionen) haben. |
| o | (Output format) Wenn mehrere res Blöcke vorhanden sind, dann wird dieser Parameter ausgewertet: wenn er gleich 0 (Null) ist, dann wird der erste "res"-Abschnitt benutzt, wenn er gleich 1 (Eins) ist, der zweite, und so weiter |
| wf | (Weight Factor) Die einzelnen Bestandteile einer Seite können für die Suche unterschiedlich gewichtet werden. |
Damit die Vorlagen mit Leben erfüllt werden können, muß das Programm
natürlich erst einmal wissen, wohin welche Informationen geschrieben
werden soll. Dazu werden in der Vorlage Platzhalter gelassen, die dann
durch die entsprechenden Werte gefüllt werden.
Diese Platzhalter sind wie folgt aufgebaut: Zuerst kommt ein
Dollarzeichen $, danach optional ein spezielles
Veränderungszeichen und danach ein Bezeichner in runden Klammern.
Mit Hilfe des Modifikationszeichens können die einzufügenden Werte
abgeändert werden. Was diese Modifikationszeichen im einzelnen
bewirken, kann der nächsten Tabelle entnommen werden:
| $(x) | Der Wert des Bezeichners wird einfach eingefügt (z.B. aus "$(URL)" wird "http://www.hu-berlin.de/") |
| $%(x) | Der Wert des Bezeichners wird HTML-escaped, d.h. bestimmte Zeichen
werden durch ihr HTML-Äquivalent ersetzt. (z.B. aus "$(URL)" wird "http:%2f%2fwww.hu-berlin.de%2f") |
| $^(x) | Suchbegriffe im Wert des Bezeichners werden hervorgehoben. |
| $&(x) | Der Wert des Bezeichners wird HTML-escaped und vorhandene Suchbegriffe werden hervorgehoben. |
Im weiteren werden jedoch alle Bezeichner nur mit
$(bezeichner) gekennzeichnet, obwohl natürlich auch die anderen
Modifikatoren benutzt werden können.
Da der Inhalt mancher Bezeichner sehr lang werden kann und damit jedes
Layout zerstören würde, gibt es die Möglichkeit eine Längenbegrenzung
der Anzeige festzulegen. Dafür wird dem Bezeichnernamen ein
Doppelpunkt, gefolgt von einer Zahl, anfügt. So kann z.B. die Länge der
Ausgabe von "$(URL)" auf 40 Zeichen beschränkt werden, indem
"$(URL:40)" verwendet wird.
In der folgenden Tabelle sind nun alle Bezeichner und ihre Bedeutungen
aufgeführt. Bei Bezeichnern, die nur innerhalb bestimmter Blöcke gültig
sind, steht der Blockname davor.
| $(self) | Der Name des Suchscriptes. Ist sehr nützlich um z.B. Links auf sich selbst herzustellen. | |
| restop | $(first) | Die Nummer des ersten gefundenen Dokuments auf dieser Seite. |
| restop | $(last) | Die Nummer des letzten gefundenen Dokuments auf dieser Seite. |
| restop | $(total) | Insgesamt gefundene Dokumente. |
| restop | $(WE) | Die Suchergebnisse inklusive einer Aufschlüsselung der Häufigkeit der Treffer für die einzelnen Suchbegriffe. |
| res | $(URL) | Die URL des gefundenen Dokuments. |
| res | $(Title) | Der Dokumententitel. |
| res | $(Score) | Die Platzierung dieses Dokuments (wird von mnoGoSearch berechnet) |
| res | $(Body) | Die ersten Zeilen des Dokuments, damit man eine Vorstellung hat, worum es bei diesem Dokument geht. |
| res | $(Content-Type) | Der Content-type des Dokuments (z.B. application/pdf) |
| res | $(Last-Modified) | Das Datum der letzten Änderung des Dokuments. |
| res | $(Content-Length) | Die Größe des Dokuments |
| res | $(Order) | Die Nummerierung des Dokuments (Reihenfolge auf der Seite) |
| res | $(meta.description) | Eine Beschreibung des Dokuments (aus dem META DESCRIPTION tag) |
| res | $(meta.keywords) | Die Schlüsselwörter des Dokuments (aus dem META KEYWORDS tag) |
| res | $(DE) | Falls $(meta.description) nicht leer ist, dann wird der Inhalt aus $(meta.description) eingefügt, falls es doch leer ist, dann wird der Inhalt von $(Body) eingefügt. Damit kann der Ersteller einer Seite beeinflußen, was die Benutzer der Suchmaschine als Beschreibung der Seite zu sehen bekommen. |
| resbot | $(NL) | (Navigation Left) Wird durch navleft oder navleft_nop ersetzt. |
| resbot | $(NB) | (Navigation Bar) Wird durch navbar0 und navbar1 ersetzt. |
| resbot | $(NR) | (Navigation Right) Wird durch navright oder navright_nop ersetzt. |
