Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Objektbasierte Index Server Suche

Geschrieben von: Christoph Wille
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

Das Abfragen von Index Server Katalogen mit den berühmt-berüchtigten IDQ und HTX Dateien ist nicht unbedingt jedermann's Sache. Im heutigen Artikel stelle ich die Index Server Search Objects (IXSSO) vor, mit denen man bequem von ASP aus die Suche starten, und die Resultate als Recordsets geliefert bekommen kann.

Unser Suchformular

Natürlich benötigen wir ein Formular, in dem der Benutzer seine Suchanfrage eintippen kann. Der Einfachheit halber habe ich nur die Möglichkeit geschaffen, ein Schlüsselwort anzugeben - dies entspricht der einfachen Abfrage, die man auf den meisten Websites findet.

<form method="post" action="<%=Request.ServerVariables("SCRIPT_NAME")%>">
Search 4: <input type="text" name="SearchKeyword" value="">&nbsp;
<input type="submit" value="Suche starten!">
</form>

Das Formular postet auf sich selbst zurück - das heißt, ich habe auch den Suchcode in der gleichen ASP Datei eingebaut.

Der Suchcode

Für das Suchen bediene ich mich diesmal zweier Objekte - dem IXSSO Query und Util Objekt. Im heute gezeigten Beispiel übernimmt das Query Objekt die meiste Arbeit, in vielen anderen Beispielen kommt Util zu mehr Ehren - zur Auswahl von Scopes. Das machen wir heute über die Abfrage im Query Objekt.

Ich habe versucht, den Code leicht anpassbar zu halten - daher sind am Anfang drei Konstanten definiert, deren wichtigste der Name des Catalogs ist, den man durchsuchen will. Den Namen findet man im Index Server Snap-In heraus (bei IDQ/HTX gibt man den Pfad zum Catalog an!).

<%
Const cstrCatalog = "Web"
Const cMinKeywordLength = 3
Const cMaxRecords = 50

strKeyword = Trim(Request.Form("SearchKeyword"))
If Len(strKeyword) >= cMinKeywordLength Then
    strIXQuery = "$CONTENTS " & strKeyword
    strIXQuery = strIXQuery & " AND NOT #VPath = *\includes* "
    strIXQuery = strIXQuery & " AND NOT #filename login.asp "
    strIXQuery = strIXQuery & " AND NOT #filename *.|(txt|,inc|,udl|,doc|)"
    
    Set objQuery = Server.CreateObject("IXSSO.Query")
    Set objUtil = Server.CreateObject("IXSSO.Util")
    
    objQuery.Query = strIXQuery
    objQuery.Columns = "Vpath,DocTitle,Filename,Characterization,Contents,Rank"
    objQuery.SortBy = "Rank[d]"
    objQuery.MaxRecords = cMaxRecords
    objquery.Catalog = cstrCatalog
    objquery.LocaleID = objutil.ISOToLocaleID("EN-US")

    Set rsIX = objQuery.CreateRecordset("nonsequential")
    While Not rsIX.EOF
        Response.Write "<p><a href=""" & rsIX("vpath") & """>"
        Response.Write rsIX("DocTitle") & "</a><br>" & vbCrlf
        Response.Write "<i>" & rsIX("Characterization") & "</i></p>"
        rsIX.MoveNext
    Wend
    rsIX.Close
    Set rsIX = Nothing
    Set objUtil = Nothing
    Set objQuery = Nothing
End If
%>

Im Prinzip haben wir es bei den Eigenschaften des Query Objektes mit alten Bekannten zu tun: den gewünschten Spalten, der Sortierordnung, der Anzahl der Records, dem Namen des Catalogs und der Locale ID. Viel interessanter ist aber der Aufbau des Suchstrings:

strIXQuery = "$CONTENTS " & strKeyword
strIXQuery = strIXQuery & " AND NOT #VPath = *\includes* "
strIXQuery = strIXQuery & " AND NOT #filename login.asp "
strIXQuery = strIXQuery & " AND NOT #filename *.|(txt|,inc|,udl|,doc|)"

Die erste Zeile definiert, wonach wir suchen wollen. Und dann folgt einiges an Information, was wir von Index Server nicht geliefert bekommen wollen: Dateien im Verzeichnis Includes, Dateien mit dem Namen login.asp, sowie alle Dateien mit den gezeigten Dateiendungen. Klarerweise kann man noch weitere Dateien exkludieren, ebenso wie Verzeichnisse oder weitere Dateiendungen.

Hinweis Die gezeigten Befehle für die Abfrage sind nur ein Teil der Syntax, die von Index Server zur Verfügung gestellt wird. Ein Besuch der Hilfe zum Thema IXSSO ist dringend empfohlen!

Führt man die Abfrage aus, bekommt man ein etwas spartanisch formatiertes Ergebnis (siehe Screenshot). Ein wenig optischer Aufputz, und man hat ein perfektes Suchresultat!

Schlußbemerkung

Die Funktion CreateRecordset liefert ein richtiges Recordset - man kann also ohne weiteres auch Paging einbauen, wie man es bereits aus den "normalen" Datenbankszenarien gewohnt ist.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010403.zip

Verwandte Artikel

Arbeiten mit Index Server Catalogs
http:/www.aspheute.com/artikel/20000524.htm
Index Server Abfragen per Web Service
http:/www.aspheute.com/artikel/20021107.htm
PDF Dokumente suchbar machen
http:/www.aspheute.com/artikel/20010914.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.