Index-Server: Volltextsuche auf der Website

02.09.2003 von THOMAS WOELFER 
Mit dem Indexdienst von Windows 2000/2003 und XP kann man nicht nur lokal nach Dateien suchen. Es ist auch ohne Probleme möglich, damit seinen IIS-Webserver mit einer Volltextsuche auszustatten.

Der einfachste Weg, eine Webseite mit Suchfunktion auszustatten, besteht darin, einen passenden Link auf Google anzubieten, der die Suche auf die eigenen Seiten einschränkt. Der Haken dabei ist aber, dass man keinerlei Einfluss auf die Darstellung der Ergebnisse oder auf die tatsächlich indizierten Seiten hat. Daher ist es besser, eine eigene Suche zu verwenden. Beim Windows 2000/2003 bietet sich dafür der Indexdienst an.

Der Indexdienst ist ein Windows-Service, der ständig im Hintergrund läuft, Dateien einsammelt und indiziert. Die Indizes speichert der Dienst ab und aktualisiert sie bei Bedarf automatisch: Einmal installiert, muss man sich um den Dienst nicht weiter kümmern. Er erledigt seine Aufgaben klaglos und unbemerkt.

Die erstellten Indizes kann man auf verschiedene Weisen abfragen und die Ergebnisse einfach zur Verfügung stellen. Deshalb eignet sich der Indexdienst nicht nur für das schnelle Durchsuchen der eigenen Festplatte, sondern eben auch als Suchmechanismus für Besucher der eigenen Website.

Zu Testzwecken kann man auch ein System unter Windows XP verwenden, denn zumindest in der Professional-Version ist der Indexdienst ebenfalls enthalten. Er kann übrigens nicht nur ASCII- oder ANSI-Dateien indizieren, sondern auch Dateien aus dem Office-Paket. Veröffentlicht man auf seinem Webserver also auch Word- oder Excel-Dateien, etwa für ein Intranet, so kann der Besucher diese Dateien ebenfalls durchsuchen lassen.

Daten in Katalogen einsammeln

Den Indexdienst starten und stoppen Sie ganz normal über die Anwendung zur Verwaltung von Diensten. Für die Konfiguration des Dienstes müssen Sie allerdings die Computerverwaltung bemühen. Im Ast "Dienste und Anwendungen" findet sich der Indexdienst als eigener Eintrag. Unterhalb dieses Eintrags gibt es normalerweise nur einen Punkt: Der Katalog "System".

Der Indexdienst kann jedoch nicht einfach nur die komplette Platte indizieren. Stattdessen ist es möglich, einen Satz an Verzeichnissen auszuwählen und diesen einem so genannten Katalog zuzuordnen. Die Suche lässt sich dann später auf einzelne Kataloge einschränken. Das ist zum Beispiel dann praktisch, wenn mehrere virtuelle Webserver auf einem Windows Server 2003 laufen. In einem solchen Fall soll die Volltextsuche eines Servers sicherlich keine Inhalte eines anderen Servers als Resultat liefern. Um das zu verhindern, legt man verschiedene Kataloge an: einen für jeden virtuellen Server. In den Katalogen schließt man die zum Host gehörenden Verzeichnisse ein. Dadurch entsteht für jeden Host ein eigener Katalog, in dem nur die Dateien indiziert sind, die zum jeweiligen Host gehören.

Beim ersten Anlegen der Kataloge muss man ein wenig Geduld aufbringen, denn die Indexerstellung dauert eine ganze Weile. Das liegt in erster Linie daran, dass der Indexdienst mit einer sehr geringen Priorität ausgeführt wird und sofort pausiert, sobald andere Tasks auf dem Server ausgeführt werden. Bei späteren Änderungen an Seiten macht sich diese Verzögerung kaum bemerkbar, denn eine einzelne veränderte Seite ist schnell im Index aktualisiert - hat man hingegen den Indexdienst gerade zum ersten Mal für viele hundert oder gar tausend Seiten angeworfen, braucht es seine Zeit, bis der Index benutzbar wird.

Die Indizes des Indexdienstes lassen sich auf drei Arten verwenden: Zum einen kann man das Suchformular aus der Computerverwaltung nutzen, zum anderen die ganz normale Suchfunktion von Windows über "Dateien suchen" im Startmenü. Greift man auf diese zurück, benutzt Windows 2003 - anders als die Vorgängerversionen - direkt einen vorkonfigurierten Index zur Suche. In diesem Fall erscheint in der Statuszeile der Suche ein Hinweis mit dem Wortlaut "Searching by Index".

Index-Server per ASP nutzen

Für die Suche beim Webserver-Betrieb muss man ein Script programmieren, das dem User ein Suchformular anbietet und dann direkt mit dem Index-Server kommuniziert, um die Suche durchzuführen. Der Indexdienst liefert die Ergebnisse als normales Result-Set, das Sie nach Wunsch auf der Seite anzeigen können. Im weiteren Verlauf dieses Beitrags erfahren Sie, wie Sie ein solches Script programmieren. Verwendet wird dabei ASP im IIS 6. Beachten Sie dabei, dass im IIS 6 ASP von Haus aus nicht eingeschaltet ist. Damit Sie ASP-Seiten nutzen können, müssen Sie ASP zunächst in der Management-Konsole des IIS aktivieren.

Bei der Präsentation der Suchergebnisse und auch bei der Suche selbst gibt es eine Reihe von Dingen, die zu berücksichtigen sind. So wollen Sie vermutlich nicht alle Dateien durchsuchen - oder zumindest nicht alle Suchresultate darstellen lassen. Ein Grund dafür könnte beispielsweise die Verwendung von XML-Quelldaten für Ihre Site-Navigation sein: Diese Dateien sollen Ihre Besucher sicherlich nicht zu Gesicht bekommen.

Dann ist es natürlich so, dass ein Suchergebnis möglicherweise viele Resultate enthält. Es kann sich also als notwendig erweisen, die Ergebnisse auf mehrere Seiten aufzuteilen. Dazu will man jeweils eine Seitennummer anzeigen, die dem Leser mitteilt, wo er sich innerhalb der Suchresultate befindet. Damit das Beispiel übersichtlich bleibt, gehen wir auf diese Problematik nicht weiter ein. Stattdessen wird einfach nur die Suche durchgeführt: Wenn Sie auf der Suche nach einem etwas ausführlicheren Beispiel für die Verwendung des Indexdienstes sind, können Sie etwa den Quellcode des Suchformulars von Windows Server 2003 verwenden: Dort lässt sich beispielsweise in den Suchresultaten blättern.

Ein Beispiel-Script

Zunächst brauchen Sie einen Such-String. Dazu erstellen Sie ein HTML-Formular, das ein Textfeld mit dem Namen SearchString enthält. Dieses wird an das Such-Script geschickt, wo der SearchString dann mit dem folgenden Statement ausgelesen wird:

SearchString = Request.Form("SearchString")

Mit dem Such-String können Sie die Suche ein wenig präzisieren. Als Erstes brauchen Sie dazu aber ein Objekt, das Sie zur Kommunikation mit dem Indexdienst verwenden. Das erzeugen Sie zunächst per CreateObject():

set Q = Server.CreateObject("ixsso.Query")

Danach legen Sie fest, was und wie gesucht werden soll. Am einfachsten wäre es dabei, dem Query den Such-String zuzuweisen: In diesem Fall würde der String in allen Dateien gesucht werden. Um die Suche jedoch etwas einzuschränken, können Sie das folgende Statement verwenden. Dabei werden nur HTML- und ASP-Seiten durchsucht - und von diesen auch nur der Inhalt. Gesucht wird dabei der in SearchString eingegebene Text:

Q.Query = "#filename = *.|(html|,htm|,asp|,aspx|) & $contents " & SearchString

Als Nächstes geben Sie an, wie das Sortieren der Ergebnisse erfolgen soll. Der Indexdienst kann nach einer ganzen Reihe von Bedingungen sortieren, am einfachsten ist es aber, wenn man den Page-Rank, den der Suchdienst selbst ermittelt hat, zum Sortieren verwendet:

Q.SortBy = "rank[d]"

Ergebnismenge festlegen

Schließlich müssen Sie spezifizieren, was alles im Suchresultat enthalten sein soll. Der Indexdienst merkt sich eine recht große Anzahl von Informationen über jede einzelne Datei. Welche das im Einzelnen sind, können Sie im Ordner "Eigenschaften" im Bereich der Kataloge in der Computerverwaltung nachsehen. Die meisten Informationen sind selbsterklärend: So lassen sich zum Beispiel der Titel eines Dokuments, seine Größe und sein Pfad ermitteln:

Q.Columns = "DocTitle, vpath, path, filename, size, write, characterization"

Nun müssen Sie noch festlegen, in welchem Katalog die Suche stattfinden soll. Dabei geben Sie den Namen des Katalogs an, den Sie zuvor in der Computerverwaltung für den Webserver angelegt haben.

Q.Catalog = "meinesite.de"

Damit ist die Suche vollständig definiert. Sie können sie nun anstoßen, indem Sie vom Query-Objekt ein RecordSet erstellen lassen:

set RS = Q.CreateRecordSet("nonsequential")

Resultat ausgeben

Über dieses Recordset iterieren Sie dann. Bei jedem Schritt erhalten Sie das jeweils nächste Ergebnis aus den Suchresultaten. Je nach Konfiguration Ihres Servers ist es dabei noch notwendig, Informationen über die Pfade der gefundenen Dateien in ein Format umzuwandeln, das für das Web geeignet ist: Von Haus aus liefert der Indexdienst nur lokale Pfade zu den gefundenen Dateien.

<%
Do While Not RS.EOF
%>

<%if VarType(RS("DocTitle")) = 1 or RS("DocTitle") ="" then%>
<a href="<%=RS("path")%>"><%= Server.HTMLEncode( RS("filename") )%></a>
<%else%>
<a href="<%=htpath%>"><%= Server.HTMLEncode(RS("DocTitle"))%></a>
<%end if%>

<%if VarType(RS("characterization")) = 8 and RS("characterization") <> "" then%>
<%= Server.HTMLEncode(RS("characterization"))%>
<%end if%>


<%
RS.MoveNext
Loop
%>

Im vorgestellten Beispiel haben Sie nur auf einen kleinen Teil der Möglichkeiten des Indexdienstes zugegriffen. Der Dienst stellt eine weit größere Menge an Funktionalität über verschiedene Objekte zur Verfügung. Die vollständige Referenz zu diesen Objekten finden Sie im Microsoft Developer Network (MSDN).

Fazit

Mit dem Indexdienst und ein wenig Script können Sie auch eine große Webseite mit einer sehr effizienten Volltextsuche ausstatten. Dabei ist es sogar möglich, Office-Dokumente automatisch mit indizieren zu lassen. Auf eines müssen Sie dabei aber achten: darauf, dass Ihre Suchresultate keine Ergebnisse mit Daten enthalten, die nicht für die Öffentlichkeit bestimmt sind. Solche Daten haben aber eigentlich von vornherein nichts auf einem Webserver verloren. (mha)