DevTrain

Autor: Bernhard Elbl

komplexe Suche über MS Index Server - Teil 2

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|)
 
weitere Info zur Index Server - Query Language
http://www.hostingsolutions.net/ixqlang.htm

Beispiel:
2. Script-Implementierung
Dieses 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) & "&nbsp;-</a>&nbsp;&nbsp;|&nbsp;&nbsp;"
  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
%>
 

Erfasst am: 12.02.2002 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=705
© Copyright 2003 ppedv AG - http://www.ppedv.de