Im zweiten Teil geht es um die Implementierung des Query Scripts, welches die eigentliche Suche über den Index Server darstellt. Das Problematische ist die IX Query Language. Die Suchergebnisse kommen in Form eines ADO Recordsets zurück.
Vorweg kurze Erklärungen zur IX Query Language in Form von Beispielen:
$CONTENTS ppedv visual basic
-> Suche nach Dokumenten, die jeweils mindestens eines der 3 Wörter enthalten müssen
@CONTENTS ppedv visual basic
-> Suche nach Dokumenten, die den festen Wortlaut "ppedv visual basic" enthalten
$CONTENTS ppedv AND visual AND basic
-> Suche nach Dokumenten, die alle Suchwörter enthalten
NOT #VPath *|(cgi*|,_private*|,images*|,*vti*|)
-> Suche nur in Folders, die nicht "cgi*,_private*..." enthalten
@size > 1000
-> Nur Dateien durchsuchen, die Grösser sind als 1000 Bytes
@filename = "ppedv.htm"
-> Durchsuche die Datei ppedv.htm
#filename = "pped*"
-> Durchsuche alle Dateien, die mit "pped" beginnen
#filename *.|(htm|,html|,shtml|,asp|,aspx|)
-> Durchsuche Dateien, mit den Extensions htm, html, shtml, asp...
TIP! Diese Schreibweise auch für VPath anwenden.
Komplettes Beispiel:
$CONTENTS ppedv AND visual AND basic
AND NOT #VPath *|(cgi*|,_private*|,images*|,*vti*|)
AND @size > 1000
AND #filename *.|(htm|,html|,shtml|,asp|,aspx|)
Beispiel:2. Script-ImplementierungDieses ASP-Script muss an der Stelle des HTML-Kommentars "<!-- Script für Index Server -->" des 1. Teils eingefügt werden.
<%
'Aktuelle Seite der Suchergebnisse bestimmen if Request.Form("newSearch") <> "" or clng(Request.Form("txtActPos")) = 0 then vActPage = 1 else vActPage = clng(Request.Form("txtActPos")) end if ' Suchbegriff bestimmen (aus Form oder QueryString) if len(Trim(Request.Form("txtSearchKeyword"))) <> 0 then sKeyword = Trim(Request.Form("txtSearchKeyword")) elseif len(Request.QueryString("SearchKey")) <> 0 then sKeyword = trim(Request.QueryString("SearchKey")) end if ' Suchbegriff muss 3 Zeichen betragen if len(sKeyword) >= 3 then ' Art der Suche Definieren select case Request.Form("SearchType") case "exact" sKeyString = "@CONTENTS " & sKeyword case "allWords" aKeyword = split(sKeyword, " ") for y = 0 to ubound(aKeyword) sKeyString = sKeyString & aKeyword(y) & " AND " next sKeyString = "$CONTENTS " & left(sKeyString,len(sKeyString)-5) case "profi" sKeyString = "$CONTENTS " & sKeyword case else sKeyString = "$CONTENTS " & sKeyword end select
sIXQuery = sKeyString & " " sIXQuery = sIXQuery & " AND NOT #VPath *|(dwnld*|,cgi*|,_private*|,images*|,*vti*|) " sIXQuery = sIXQuery & " AND @size > 1000 " sIXQuery = sIXQuery & " AND NOT #DocTitle = '' " sIXQuery = sIXQuery & " AND #filename *.|(htm|,html|,shtml|,asp|,aspx|)" set oQuery = Server.CreateObject("IXSSO.Query") set oUtil = Server.CreateObject("IXSSO.Util") with oQuery .Query = sIXQuery .Columns = "DocTitle, Filename, VPath, Characterization, Contents, Rank" .SortBy = "rank[d]" ' Sortieren .MaxRecords = 200 ' Maximale Anzahl der Suchergebnisse .Catalog = "web" ' Name des Katalogs end with
' Recordset mit Such-Ergebnisse erstellen Set rsIX = oQuery.CreateRecordset("nonsequential") if (not rsIX.EOF) and (not rsIX.BOF) then ' Mit Hilfe von Absolute Page Seite anzeigen rsIX.PageSize = 4 rsIX.AbsolutePage = vActPage for z = 1 to rsIX.PageSize if i >= vStartPos then ' nicht anzeigen wenn kein DocTitle oder kein Dateiname vorhanden ist if len(rsIX("DocTitle")) > 2 or len(rsIX("filename")) > 2 then Response.Write "<table cellspacing=""3"" cellpadding=""1"" width=""100%"" class=""searchitem"">" Response.Write "<tr><th>" if VarType(rsIX("DocTitle")) = 1 or rsIX("DocTitle") = "" then ' kein Titel verfügbar --> Dann Dateinamen anzeigen: Response.Write "<a href=""" & rsIX("vpath") & """>" & Server.HTMLEncode(rsIX("filename")) & "</a>" else Response.Write "<a href=""" & rsIX("vpath") & """>" & Server.HTMLEncode(rsIX("DocTitle")) & "</a>" end if Response.Write "</th></tr>" ' Beschreibung ausgeben Response.Write "<tr><td>" & rsIX("Characterization") & "</td></tr>" Response.Write "</table><br>" end if end if rsIX.MoveNext i = i + 1 if rsIX.EOF then exit for next ' weitere Seiten-Suchergebnisse anzeigen for l = 1 to rsIX.PageCount rsIX.AbsolutePage = l sLinks = sLinks & "<a href='javascript:ViewThis(" & rsIX.AbsolutePage & ");'>" & (rsIX.AbsolutePage*rsIX.PageSize)-(rsIX.PageSize-1) & " -</a> | " next sLinks = left(sLinks,len(sLinks)-13) ' Wenn keine Suchergebnisse vorhanden sind... else Response.Write "<table cellspacing=""3"" cellpadding=""1"" width=""100%"" class=""searchitem"">" Response.Write "<tr><th>Für den Suchbegriff """ & sKeyword & """ wurden keine Treffer gefunden</th></tr>" Response.Write "</table><br>" end if rsIX.Close set rsIX = nothing set oUtil = nothing set oQuery = nothing end if %>
|